AtomText:string;//添加一个String的全局变量用于保存原子名称 ........procedure LookFroPreviousInstance; var PreviousInstanceWindow:hWnd; AppName:Tatom; FoundAtom:Tatom; begin AtomText:='onlyOne'+Application.Title; FoundAtom:=GlobalFindAtom(pChar(AtomText)); if FoundAtom<>0 then begin showMessage('该程序已经在运行'); AppName:=Application.Title; Application.ShowMainForm:=False; Application.Title:='Destroy me'; previousInstancWindow:=FindWindow(nil,pChar(AppName)); if PreviousInstanceWindow<>0 then if IsIconic(PreciousInstanceWindow) then showWindow(PreviousInstanceWindow,SW_RESTORE) else SetForegroundWindow(PreviousInstanceWindow); Application.Terminate;
end else GlobalAddAtom(PChar(AtomText)); procedure TForm1.FormCreate(Sender:Tobject); begin inherited; LookforPreViousInstance; end; //FormDestroy也要重写,找到该原子进行销毁
procedure Tmaimform.FormCreate(sender:TObject); var temp:integer; ZAPPname:array[0..127]of char; Hold:string; Found:HWND; begin systemparametersinfo(spi_screensaverrunning,1,@temp,0); Hold:=application.Title; Application.Title:='only'+IntTOstr(HInstance); StrPCopy(ZAppName,Hold); Found:=FindWindow(nil,ZAPPName); Application.Title:=Hold; if Found<>0 then begin showwindow(Found,SW_RESTORE); Application.terminate; end ; application.OnHint:=myshowhint; end;
var hnd: THandle;initialization //建立一个互斥对象,防止应用程序被重复开启 hnd := CreateMutex(nil, True, 'abc'); if GetLastError = ERROR_ALREADY_EXISTS then Halt; finalization if hnd <> 0 then CloseHandle(hnd);
在project里不用写多少就可以了吧~具体的要查资料了呀~
begin
Hwnd:=FindWindow(nil,'frmmain');
If Hwnd=0 then
begin
.................
Application.Run;
end;
end;
AtomText:string;//添加一个String的全局变量用于保存原子名称
........procedure LookFroPreviousInstance;
var
PreviousInstanceWindow:hWnd;
AppName:Tatom;
FoundAtom:Tatom;
begin
AtomText:='onlyOne'+Application.Title;
FoundAtom:=GlobalFindAtom(pChar(AtomText));
if FoundAtom<>0 then
begin
showMessage('该程序已经在运行');
AppName:=Application.Title;
Application.ShowMainForm:=False;
Application.Title:='Destroy me';
previousInstancWindow:=FindWindow(nil,pChar(AppName));
if PreviousInstanceWindow<>0 then
if IsIconic(PreciousInstanceWindow) then
showWindow(PreviousInstanceWindow,SW_RESTORE)
else
SetForegroundWindow(PreviousInstanceWindow);
Application.Terminate;
end
else
GlobalAddAtom(PChar(AtomText));
procedure TForm1.FormCreate(Sender:Tobject);
begin
inherited;
LookforPreViousInstance;
end;
//FormDestroy也要重写,找到该原子进行销毁
var
temp:integer;
ZAPPname:array[0..127]of char;
Hold:string;
Found:HWND;
begin
systemparametersinfo(spi_screensaverrunning,1,@temp,0);
Hold:=application.Title;
Application.Title:='only'+IntTOstr(HInstance);
StrPCopy(ZAppName,Hold);
Found:=FindWindow(nil,ZAPPName);
Application.Title:=Hold;
if Found<>0 then
begin
showwindow(Found,SW_RESTORE);
Application.terminate;
end ; application.OnHint:=myshowhint;
end;
与
systemparametersinfo(spi_screensaverrunning,1,@temp,0);
可删除是禁用系统功能键的
if Found<>0 then
begin
showwindow(Found,SW_RESTORE);
Application.terminate;
end ;………请问楼上的,found为hwnd类型变量,它怎么也不能为0,实际验证的结果也正如我想,不好用。
表示FindWindow执行失败没有找到要找的窗口阿~~~~或者使用互斥器来实现
hnd: THandle;initialization
//建立一个互斥对象,防止应用程序被重复开启
hnd := CreateMutex(nil, True, 'abc');
if GetLastError = ERROR_ALREADY_EXISTS then
Halt;
finalization
if hnd <> 0 then
CloseHandle(hnd);