FindWindow является неполным решением (если меняется заголовок окна или если есть другая программа с таким же заголовком или типом окна).
Вторично: Это работает медленно.
Правильно - использовать обьекты синхронизации Win32 API.
Лениво пользовать семафоры, покажу на именованных мутексах (семафоры с двумя состояниями).
Unit OneInstance32;
interface
implementation
uses
Forms;
var
g_hAppMutex: THandle;
function OneInstance: boolean;
var
g_hAppCritSecMutex: THandle;
dw: Longint;
begin
g_hAppCritSecMutex := CreateMutex( nil, true,
PChar(Application.Title + '.OneInstance32.CriticalSection') );
// if GetLastError - лениво
писать
g_hAppMutex := CreateMutex( nil, false,
PChar(Application.Title + 'OneInstance32.Default') );
dw := WaitForSingleObject( g_hAppMutex, 0 );
Result := (dw <> WAIT_TIMEOUT);
ReleaseMutex( g_hAppCritSecMutex ); //
необязательно вследствие
последующего закрытия
CloseHandle( g_hAppCritSecMutex );
end;
initialization
g_hAppMutex := 0;
finalization
if LongBool( g_hAppMutex ) then
begin
ReleaseMutex( g_hAppMutex); //
необязательно
CloseHandle( g_hAppMutex );
end;
end.
Akzhan Abdulin
akzhan@mental.khv.ru