一种方法是使用 FindWindow,但如果窗口标题经常变动则不能使用。<br>var<br> PrevWnd: HWND;<br>begin<br> PrevWnd := FindWindow(nil, 'Form2');<br> if PrevWnd <> 0 then<br> begin<br> ShowMessage('Running!');<br> SetForegroundWindow(PrevWnd); // 窗口提前<br> Exit; // 退出<br> end;<br><br> Application.Initialize;<br> Application.CreateForm(TForm1, Form1);<br> Form1.Caption := 'Form2'; // 临时改个名字<br> Application.Run;<br>end.<br><br>一种方法是创建 Mutex 对象,但这样不知道如何得到窗口句柄。<br>var<br> HMutex: THandle;<br>begin<br> HMutex := CreateMutex(nil, False, 'MyAppMutexName');<br> if GetLastError = ERROR_ALREADY_EXISTS then<br> begin<br> ShowMessage('Running!');<br> Exit;<br> end;<br> Application.Initialize;<br> Application.CreateForm(TForm1, Form1);<br> Form1.Caption := 'Form2';<br> Application.Run;<br> ReleaseMutex(HMutex);<br>end.<br><br>假如找到了已存在实例的窗口,可以通过发送 WM_COPYDATA 给该窗口,通知它打开新的文件名。<br><br>我想知道如果窗口名称经常变动的时候如何找到实例的窗口。如果 Application.Title 保持不变,并用它作为窗口名称查找,那么如何处理 WM_COPYDATA 消息?<br>