{unidade exclusivaInstance;/t/t/t/t/t/t/t}
{/t/t/t/t/t/t/t/t/t}
{Verifique se a instância anterior do aplicativo existe, se sim, o anterior/t}
{A instância estará ativa e a instância atual será encerrada./t}
{/t/t/t/t/t/t/t/t/t}
{Escrito por SaveTime, http://savetime.delphibbs.com 2004/6/77/t/t}
{/t/t/t/t/t/t/t/t/t}
{Uso:/T/T/T/T/T/T/T/T}
{Inclua esta unidade ao seu projeto Delphi, não há mais trabalho a fazer./t}
{/t/t/t/t/t/t/t/t/t}
{Importante:/t/t/t/t/t/t/t/t}
{Você não deve remover a linha do projeto: Application.initialize;/t}
{/t/t/t/t/t/t/t/t/t}
{Notas:/t/t/t/t/t/t/t/t}
{Esta unidade identifica um aplicativo pelo nome do arquivo exe do EXE. Então, se você quiser}
{Para especificar outro nome de aplicativo exclusivo, você deve alterar o valor}
{UniqueApplicationName no procedimento de checkPriviousInstance./t/t}
{/t/t/t/t/t/t/t/t/t}
unidade exclusivaInstance;
interface
usa classes, sysutils, janelas, formulários;
implementação
var
UnikeMessageId: Uint;
UniqueMutexHandle: THANDLE;
AnteriorWndProc: tfnWndProc;
NextInitProc: Pointer;
Função ApplicationWndProc (HWND: HWND; UMSG: UINT; WPARAM: WPARAM;
LPARAM: LPARAM): LRESULT; stdcall;
começar
// Nota: use "<>" pode aumentar a velocidade do aplicativo.
Se umsg <> uniquiemessageId
Resultado: = CallWindowProc (anteriorWndProc, HWND, UMSG, WPARAM, LPARAM)
mais começam
Se isicônico (Application.Handle), então Application.restore;
SetForeRoundWindow (Application.Handle);
Resultado: = 0;
fim;
fim;
Procedimento traga -se -riousInstance para o solo;
const
Bsmrecipients: dword = bsm_applications;
começar
BroadcastsystemMessage (BSF_IGNORECURRENTTASK ou BSF_POSTMESSAGE,
@Bsmrecipients, uniquiemessageId, 0, 0);
Parada;
fim;
SubclassAplicação de procedimentos;
começar
AnteriorWndProc: = tfnwndproc (setWindowlong (Application.handle, gwl_wndproc,
Inteiro (@ApplicationWNDProc)));
fim;
Procedimento checkPreviousInstance;
var
UniqueApplicationName: PChar;
começar
// Nome do aplicativo exclusivo, padrão definido para exe nome do arquivo,
// Você pode mudar para si mesmo.
UniqueApplicationName: = PChar (ExtractFileName (Application.Exename));
// Registrar ID de mensagem exclusiva
UnikeMessageId: = RegisterWindowMessage (UniqueApplicationName);
// Crie objeto mutex
UnikeMutexHandle: = CreateMutex (nulo, falso, unikeAplicationName);
// Crie falhado mutex, encerrar a aplicação
se unikeMutexHandle = 0 então
HALT
// O mesmo mutex nomeado existe, mostre a instância anterior
caso contrário, se getLasterror = error_already_exists então
Traga a maior parte do fundo do solo
// Nenhuma instância anterior, janela de aplicativo de subclasse
outro
SubclassApplication;
// Ligue para o próximo initProc
Se NextInitProc <> nil, então tprocedure (nextInitProc);
fim;
inicialização
// deve usar o initProc para verificar a instância privada,
// Como o motivo do aplicativo não foi criado!
NextInitProc: = initproc;
Initproc: = @checkpreviousInstance;
Finalização
// Fechar a alça mutex
se unikeMutexHandle <> 0, então CloseHandle (UnikeMutexHandle);
fim.