Как мне изящно закрыть другое приложение? - PullRequest
5 голосов
/ 23 августа 2010

У меня есть приложение для установки на C ++ / CLI, которое должно закрыть другое написанное мной приложение, заменить .exe и dll приложения и повторно запустить исполняемый файл.

Прежде всего мне нужнозакройте это окно следующим образом:

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

Т.е. найдите соответствующий заголовок окна (который работает) ... но тогда какое сообщение мне нужно отправить удаленному окну, чтобы попросить его закрыть?

... или есть более .net-иш способ исправить это, не прибегая к директории Windows API?

Не думайте, что я ограничен .net 2.0

Ответы [ 5 ]

5 голосов
/ 23 августа 2010

WM_CLOSE * * 1004

3 голосов
/ 23 августа 2010

Вы можете позвонить 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 голосов
/ 23 августа 2010

Рекомендации от MSDN

  1. Отправка WM_QUERYENDSESSION с lParam, установленным на ENDSESSION_CLOSEAPP.
  2. Затем отправка WM_ENDSESSION с тем же lParam.
  3. Если это не сработает, отправьте WM_CLOSE.
1 голос
/ 23 августа 2010

В случае, если кто-то хочет следовать более сложному способу .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
}
0 голосов
/ 23 августа 2010

ОБНОВЛЕНИЕ

Использовать WM_CLOSE.Я был не прав.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...