我有一個應用程序在主窗體的OnCreate期間檢查應用程序的另一個實例是否已通過創建互斥體運行。如果是,則第二個實例將消息傳遞給第一個實例,然後關閉它。它工作正常,除了第二個應用程序的一小竅門,它在屏幕關閉之前在屏幕上快速閃爍。停止窗體幾乎立即關閉第二個應用程序實例時在屏幕上快速閃爍
我有一個醜陋的啓動應用程序與主窗體WindowState設置爲wsMinimize,然後使用延遲1ms的計時器來最大化窗體。但這似乎是一個可怕的黑客。
有什麼更好的點子?
procedure TMyAwesomeForm.FormCreate(Sender: TObject);
var
h: HWND;
begin
// Try to create mutex
if CreateMutex(nil, True, '6EACD0BF-F3E0-44D9-91E7-47467B5A2B6A') = 0 then
RaiseLastOSError;
// If application already running
if GetLastError = ERROR_ALREADY_EXISTS then
begin
// Prevent this instance from being the receipient of it's own message by changing form name
MyAwesomeForm.Name := 'KillMe';
// If this instance was started with parameters:
if ParamCount > 0 then
begin
h := FindWindow(nil, 'MyAwesomeForm');
//Pass the parameter to original application
SendMessage(h, WM_MY_MESSAGE, strtoint(ParamStr(1)),0);
end;
// Shut this instance down - there can be only one
Application.Terminate;
end;
// Create Jump Lists
JumpList := TJumpList.Create;
JumpList.ApplicationId := 'TaskbarDemo.Unique.Id';
JumpList.DeleteList;
CreateJList();
end;
移動你的代碼在什麼地方真正被創建的形式,在'Application.CreateForm'之前被調用,在* .dpr文件。 – TLama 2013-03-02 01:08:18
這與[此問題](http://stackoverflow.com/q/15136960/62576)的副本非常接近。那裏的答案可能會有所幫助。 (你檢查太遲了 - 當你點擊'FormCreate'時,已經太遲了,而'Application.Terminate'只是向主窗口發送'WM_QUIT'消息,你需要檢查以前的實例在'.dpr'文件中,而不是在調用'Application.Initialize'之前。) – 2013-03-02 01:12:42