type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
const MAX_BUFFER_SIZE = 260; // MAX_PATH = 260
var MyAppName, MyClassName: array[0..MAX_BUFFER_SIZE] of char; MyPopup, LastFound: HWND; NumFound: integer;
implementation
{$R *.dfm}
function LookAtAllWindows(Handle: HWND; Temp: longint): BOOL; stdcall; var WindowName, ClassName: array[0..MAX_BUFFER_SIZE] of char; begin Result := True; if (GetClassName(Handle, ClassName, SizeOf(ClassName)) > 0) then begin if (StrComp(ClassName, MyClassName) = 0) then begin if (GetWindowText(Handle, WindowName, SizeOf(WindowName)) > 0) then begin if (StrComp(WindowName, MyAppName) = 0) then begin Inc(NumFound); if (Handle <> Application.Handle) then LastFound := Handle; end; end; end; end; end;
procedure TForm1.FormCreate(Sender: TObject); begin NumFound := 0; LastFound := 0; GetWindowText(Application.Handle, MyAppName, SizeOf(MyAppName)); GetClassName(Application.Handle, MyClassName, SizeOf(MyClassName)); EnumWindows(@LookAtAllWindows, 0); if (NumFound > 1) then begin MyPopup := GetLastActivePopup(LastFound); BringWindowToTop(LastFound); if IsIconic(MyPopup) then ShowWindow(MyPopup, SW_RESTORE) else SetForegroundWindow(MyPopup); Application.Terminate; end; end;
end.
Birlikte var olmaması gereken "birbirini dışlayan" nesne oluşturarak yapılabilir : Bellekte mutex nesnesi oluşturmaya çalışırsak, sistem bunu kaydeder ve 2. kez oluşmasına izin vermez. Adına örn. "abc_XYZ" diyelim.
: // program-unit bölümü : var mHandle: THandle; // Mutexhandle : : initialization mHandle := CreateMutex(nil, True, 'abc_XYZ'); if GetLastError = ERROR_ALREADY_EXISTS then begin ShowMessage('* UYARI *'+#13#10+ 'Program şu an bellekte çalışıyor;'+#13#10+ 'Birden fazla kez çalıştırmayınız..'); halt; // program burada sonlansın end;
finalization if mHandle <> 0 then CloseHandle(mHandle) end.
NT, XP ve Vista'da çalışır. Daha önceki sürümlerde çalışır mı denemedim.. Windows sdk ile gelen yardım dosyasında; win95 ve üzerinde çalıştığı yazılı.