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

时间:2010-08-23 15:32:43

标签: .net winapi c++-cli

我有一个基于C ++ / CLI的安装应用程序需要关闭我编写的另一个应用程序,替换应用程序的.exe和dll并重新运行可执行文件。

首先,我需要沿着以下几行关闭该窗口:

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

即。找到一个匹配的窗口标题(有效)...但是我需要什么消息才能发送远程窗口让它关闭?

...还是有更多的.net-ish方法,而不诉诸Windows API直接?

请记住,我只限于.net 2.0

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

您可以使用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/

答案 2 :(得分:2)

Guidelines from MSDN

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

答案 3 :(得分:1)

如果有人想要遵循更多的.net-ish做事方式,您可以执行以下操作:

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
}

答案 4 :(得分:-1)

更新

使用WM_CLOSE。我错了。