Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I gracefully close another application?

I have a C++/CLI based install application which needs to close another app I've written, replace the application's .exe and dlls and the re-run the executable.

First of all I need to close that window along the following lines:

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

I.e. find a matching window title (which works) ...but then what message do I need send the remote window to ask it to close?

...or is there a more .net-ish way of donig this without resorting to the windows API directlry?

Bare in mind that I'm limited to .net 2.0

like image 203
Jon Cage Avatar asked Aug 23 '10 15:08

Jon Cage


4 Answers

WM_CLOSE?

like image 171
Andreas Rejbrand Avatar answered Nov 04 '22 03:11

Andreas Rejbrand


You can call WM_CLOSE using SendMessage.

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

See http://boycook.wordpress.com/2008/07/29/c-win32-messaging-with-sendmessage-and-wm_copydata/ for code sample.

like image 24
Brian Avatar answered Nov 04 '22 03:11

Brian


Guidelines from MSDN

  1. Send WM_QUERYENDSESSION with the lParam set to ENDSESSION_CLOSEAPP.
  2. Then send WM_ENDSESSION with the same lParam.
  3. If that doesn't work, send WM_CLOSE.
like image 27
Adrian McCarthy Avatar answered Nov 04 '22 02:11

Adrian McCarthy


In case anyone wants to follow the more .net-ish way of donig things, you can do the following:

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
}
like image 1
Jon Cage Avatar answered Nov 04 '22 03:11

Jon Cage