我如何优雅地关闭另一个应用程序?

问题描述:

我有一个基于C/CLI的安装应用程序需要关闭我写的另一个应用程序,替换应用程序的.exe和dll,然后重新运行可执行文件。我如何优雅地关闭另一个应用程序?

我需要关闭该窗口大意如下首先:

HWND hwnd = FindWindow(NULL, windowTitle); 
if(hwnd != NULL) 
{ 
    ::SendMessage(hwnd, (int)0x????, 0, NULL); 
} 

即找到一个匹配的窗口标题(哪些工作)...但是,然后我需要什么消息发送远程窗口要求它关闭?

......还是有更多.net-ish donig这种方式,而不诉诸于Windows API directlry?

裸记住,我仅限于.NET 2.0

+0

已尝试关闭应用程序的应用程序已发货?如果没有,您可以为此目的建立自定义消息。 – 2010-08-23 15:42:37

+0

为什么打扰时,已经有Windows消息? – 2010-08-23 15:52:15

+1

因为'WM_CLOSE'没有真正告诉应用程序退出。它告诉一个窗口关闭。主窗口关闭时,许多应用程序都会退出,但有些则不会。他们可能会打开其他窗口,或者他们可能会继续在后台运行。通过定义自定义消息,您可以确保应用程序完全按照您需要执行的操作执行,而无需重载已定义好的消息。 – 2010-08-23 16:08:07

+0

明白了 - 谢谢 – 2010-08-23 15:51:53

+0

这个答案需要改进。仅链接答案不是很好的答案;考虑在你的答案中包括实质细节。 – 2018-01-09 17:22:19

UPDATE

使用WM_CLOSE。我错了。

+0

没有。 WM_CLOSE是正确的。 WM_QUIT用于终止消息循环。大多数传统应用程序将WM_QUIT发布到自身,以便在主顶层窗口被销毁时退出主消息循环。该序列通常由WM_CLOSE启动。 – 2010-08-23 15:41:37

+0

终止消息循环通常会导致应用程序退出? Wm关闭可能不会退出应用程序,只是该窗口。我当然可以错了:) – 2010-08-23 16:11:06

+0

问题是,你不知道你要终止哪个消息循环。如果应用程序显示模态对话框会怎么样?您可能只是将应用程序置于不良状态,而不保存用户数据。我收回了我对“WM_CLOSE”所说的话。正确的做法是使用'WM_QUERYENDSESSION'和'WM_ENDSESSION'。 – 2010-08-24 20:04:34

如果有人要遵循donig东西更.NET十岁上下的方式,你可以做到以下几点:

using namespace System::Diagnostics; 

array<Process^>^ processes = Process::GetProcessesByName("YourProcessName"); 
for each(Process^ process in processes) 
{ 
    process->CloseMainWindow(); // For Gui apps 
    process->Close(); // For Non-gui apps 
} 

Guidelines from MSDN

  1. 发送WM_QUERYENDSESSION与lParam的设置为ENDSESSION_CLOSEAPP
  2. 然后用相同的lParam发送WM_ENDSESSION
  3. 如果这不起作用,请发送WM_CLOSE

您可以拨打WM_CLOSE使用SendMessage

[DllImport("User32.dll", EntryPoint = "SendMessage")] 
public static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam); 

有关代码示例,请参阅http://boycook.wordpress.com/2008/07/29/c-win32-messaging-with-sendmessage-and-wm_copydata/