delphi 杀掉exe程序,该怎么解决
delphi 杀掉exe程序
我有一个delphi的exe程序 demo.exe
我不想让这个程式双开,当第二个demo.exe运行时,想把第一个杀掉
这个怎样实现阿
我加上下面代码,会把它自己杀掉。。。。
------解决方案--------------------
var
hw : HWND;
gt : Integer;
begin
Application.Initialize;
Application.Title := 'runmyfile';
hw := CreateMutex(nil,False,'runmyfile'); {创建互斥体对象}
gt := GetLastError;
if gt <> Error_ALREADY_EXISTS then {如果没有发现互斥体对象}
begin
Application.CreateForm(TForm1,Form1); {创建窗体}
Application.Run;
end
else
begin
Application.MessageBox('程序已经运行','提示',MB_OK);
Application.Terminate;
ReleaseMutex(hw);{释放互斥体}
end;
end;
------解决方案--------------------
program XdeltaGui;
uses
Windows, Forms, SysConst,
XdeltaGui0 in 'XdeltaGui0.pas' {FrmMain};
{$R *.res}
var
Hwnd: THandle;
begin
Application.Initialize;
CreateMutex(nil, False, 'FrmMain');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
Hwnd := FindWindow('TfrmMain', 'xdeltaGUI');
if Hwnd <> 0 then
begin
SetWindowPos(hwnd, Hwnd_Topmost, 274, 206, 451, 319, 0); //274, 206, 451, 319, 0
SetWindowPos(Hwnd, Hwnd_notopmost, 274, 206, 451, 319, 0);
ShowWindow(HWnd, SW_SHOW);
Halt(0);
end;
end;
Application.Title := 'xdeltaGUI';
Application.CreateForm(TFrmMain, FrmMain);
Application.Run;
end.
------解决方案--------------------
楼上直接用halt(0)不安全吧。。应该先Application.Terminate;
------解决方案--------------------
我有一个delphi的exe程序 demo.exe
我不想让这个程式双开,当第二个demo.exe运行时,想把第一个杀掉
这个怎样实现阿
我加上下面代码,会把它自己杀掉。。。。
if not ProcedureIsExists('demo.exe') then //进程不存在则打开它
begin
ShellExecute(handle,'open','\\url\demo.exe','','',SW_SHOW);
end
else
begin
WinExec('cmd /C '+'taskkill /f /im demo.exe',0);
delay(1000);
ShellExecute(handle,'open','\\url\demo.exe','','',SW_SHOW);
end;
------解决方案--------------------
var
hw : HWND;
gt : Integer;
begin
Application.Initialize;
Application.Title := 'runmyfile';
hw := CreateMutex(nil,False,'runmyfile'); {创建互斥体对象}
gt := GetLastError;
if gt <> Error_ALREADY_EXISTS then {如果没有发现互斥体对象}
begin
Application.CreateForm(TForm1,Form1); {创建窗体}
Application.Run;
end
else
begin
Application.MessageBox('程序已经运行','提示',MB_OK);
Application.Terminate;
ReleaseMutex(hw);{释放互斥体}
end;
end;
------解决方案--------------------
program XdeltaGui;
uses
Windows, Forms, SysConst,
XdeltaGui0 in 'XdeltaGui0.pas' {FrmMain};
{$R *.res}
var
Hwnd: THandle;
begin
Application.Initialize;
CreateMutex(nil, False, 'FrmMain');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
Hwnd := FindWindow('TfrmMain', 'xdeltaGUI');
if Hwnd <> 0 then
begin
SetWindowPos(hwnd, Hwnd_Topmost, 274, 206, 451, 319, 0); //274, 206, 451, 319, 0
SetWindowPos(Hwnd, Hwnd_notopmost, 274, 206, 451, 319, 0);
ShowWindow(HWnd, SW_SHOW);
Halt(0);
end;
end;
Application.Title := 'xdeltaGUI';
Application.CreateForm(TFrmMain, FrmMain);
Application.Run;
end.
------解决方案--------------------
楼上直接用halt(0)不安全吧。。应该先Application.Terminate;
------解决方案--------------------
建一个单元unit2;
unit Unit2;
interface
uses
Forms, Windows, Messages;
var _HMutex:hwnd;
procedure KillSelf();
implementation
procedure KillSelf();
var
H:HWND;
begin
if OpenMutex(MUTEX_ALL_ACCESS,False,PChar(Application.Title))<>0 then
begin
{关闭前者,或者自己退出用halt或用Application.Terminate}
H:=FindWindow(nil,'Form1');
if H<>0 then
PostMessage(H,WM_Close,0,0);
end;
//创建互斥
_HMutex := CreateMutex(nil, False, PChar(Application.Title));
end;
end.
{在program工程文件调用:}
Application.Initialize;
KillSelf();
...
{在程序关闭时加上,比如在主窗体Close事件:}
ReleaseMutex(_HMutex);