to: sundayboys(sunboy) 谢谢,我下线试一下,不行再来问你。现在我还不想结束贴子,看看还有没有人回复,我会给分的。
用原子(Atom):procedure CheckPrevInstance; var PrevWindow: HWND; i: Integer; Atom: TAtom; begin if GlobalFindAtom(PChar('APPLICATION_IS_RUNNING')) = 0 then begin CheckPreInsAtom := GlobalAddAtom(PChar('APPLICATION_IS_RUNNING')); end else begin repeat PrevWindow := FindWindow('MAINFORM_CLASS', nil); until PrevWindow <> 0; for i := 1 to ParamCount do begin Atom := GlobalAddAtom(PChar(ParamStr(i))); SendMessage(PrevWindow, WM_XXXX, Atom, 0); // 通知消息 GlobalDeleteAtom(Atom); end; SetForeGroundWindow(PrevWindow); SendMessage(PrevWindow, WM_XXXX, 0, 0); // 通知消息 Halt; end; end;APPLICATION_IS_RUNNING 是应用程序运行标志 MAINFORM_CLASS 是主窗口类名 WM_XXXX 是发送给应用程序的消息,起到通知的作用以上在 Application.Initialize 前调用
参考下面一段程序 program project1;uses Forms, windows, .....{$R *.RES}begin CreateMutex(Nil,false,'project1'); if GetLastError = ERROR_ALREADY_EXISTS then begin if Application.MessageBox('程序project1正在运行,是否再另外打开一个?','project1',4)=IDNO then begin SendMessage(HWND_BROADCAST,RegisterWindowMessage('eExs'),0,0); Halt(0); end; end; Application.Initialize; Application.CreateForm(Tfrmmain, frmmain); Application.Run; end.这样可以让用户自己决定是否再运行一次本程序。
当发现已经运行,然后FindWindowsEx找那个窗口的句柄,找到后PostMessage(runingHandle,OPEN_NEW_FILE,Nil,Nil),这个OPEN_NEW_FILE是自己定义的消息,然后你在程序里边处理这个自定义消息就行了。
文件的路径可以从commandline中获取。
var
PrevWindow: HWND;
i: Integer;
Atom: TAtom;
begin
if GlobalFindAtom(PChar('APPLICATION_IS_RUNNING')) = 0 then
begin
CheckPreInsAtom := GlobalAddAtom(PChar('APPLICATION_IS_RUNNING'));
end else
begin
repeat
PrevWindow := FindWindow('MAINFORM_CLASS', nil);
until PrevWindow <> 0;
for i := 1 to ParamCount do
begin
Atom := GlobalAddAtom(PChar(ParamStr(i)));
SendMessage(PrevWindow, WM_XXXX, Atom, 0); // 通知消息
GlobalDeleteAtom(Atom);
end;
SetForeGroundWindow(PrevWindow);
SendMessage(PrevWindow, WM_XXXX, 0, 0); // 通知消息
Halt;
end;
end;APPLICATION_IS_RUNNING 是应用程序运行标志
MAINFORM_CLASS 是主窗口类名
WM_XXXX 是发送给应用程序的消息,起到通知的作用以上在 Application.Initialize 前调用
program project1;uses
Forms,
windows,
.....{$R *.RES}begin
CreateMutex(Nil,false,'project1');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
if Application.MessageBox('程序project1正在运行,是否再另外打开一个?','project1',4)=IDNO then
begin
SendMessage(HWND_BROADCAST,RegisterWindowMessage('eExs'),0,0);
Halt(0);
end;
end;
Application.Initialize;
Application.CreateForm(Tfrmmain, frmmain);
Application.Run;
end.这样可以让用户自己决定是否再运行一次本程序。