二个相同的程序同时运行的问题!(50分)

  • 主题发起人 主题发起人 lovenuo
  • 开始时间 开始时间
L

lovenuo

Unregistered / Unconfirmed
GUEST, unregistred user!
程序运行后,如果在运行这个程序的时候(第一次运行的不关闭在运行),会把原来运行程序的窗体设置为当前窗体!第二次运行的程序自动关闭!(要求没有闪烁窗体)。如果只运行一次的话,程序正常启动!给出例子代码,谢谢!
 
用互拆吧

program Project1;

uses
Forms,
Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
if OpenMutex(MUTEX_ALL_ACCESS,True,'Projectabc')>0 then
begin
MessageBox(0,'程序已经在运行','错误',MB_OK);
end
else begin
CreateMutex(nil,True,'Projectabc');
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
CloseHandle(OpenMutex(MUTEX_ALL_ACCESS,True,'Projectabc'));
end;
end.
 
单实例应用程序,如果有前一个实例,则使它获得焦点:
program Project1;

uses
Forms, Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

var Mutex: THandle;

procedure CheckPrevInst;
var
PrevWnd: HWnd;
begin
Mutex:=CreateMutex(NIL, False, 'SingleInstanceProgramMutex');
if WaitForSingleObject(Mutex, 10000)=WAIT_TIMEOUT then Halt;
PrevWnd:=FindWindow('TForm1', 'Form1');
if PrevWnd<>0 then PrevWnd:=GetWindow(PrevWnd, GW_OWNER);
if PrevWnd<>0 then begin
if IsIconic(PrevWnd) then
ShowWindow(PrevWnd, SW_SHOWNORMAL)
else
SetForegroundWindow(PrevWnd);
Halt;
end;
end;


begin
Application.Initialize;
try
CheckPrevInst;
Application.CreateForm(TForm1, Form1);
finally
Form1.HandleNeeded;
ReleaseMutex(Mutex);
CloseHandle(Mutex);
end;
Application.Run;
end.
 
楼上2位的方法有个问题,就是:程序运行后,用右键单击选“运行方式...”,程序仍能运行!有什么办法解决这个问题呢?
 
var
hnd: THandle; //防止程序执行两次变量,定义在全局变量下
//在主form的end.前添加如下语句
initialization
hnd := CreateMutex(nil, True, 'LDM.exe'); //'LDM.exe为可执行文件名
if GetLastError = ERROR_ALREADY_EXISTS then Halt;
finalization
if hnd <> 0 then
begin
ShowMessage('你已经启动了一个同样的程序');
CloseHandle(hnd);
end;
 
var
hnd: THandle; //防止程序执行两次变量,定义在全局变量下
//在主form的end.前添加如下语句
initialization
hnd := CreateMutex(nil, True, 'LDM.exe'); //'LDM.exe为可执行文件名
if GetLastError = ERROR_ALREADY_EXISTS then Halt;
finalization
if hnd <> 0 then
begin
ShowMessage('你已经启动了一个同样的程序');
CloseHandle(hnd);
end;
 
不会啊,我用右键单击选“运行方式...”,仍然是运行先前那个实例。你试了吗?
 
Mutex:=CreateMutex(NIL, False, 'SingleInstanceProgramMutex');
这个方式,软件非正常关闭后,再运行会有问题吗?
 
接受答案了.
 
后退
顶部