2010-08-23 94 views
4

我有一個基於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

回答

5
+0

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

+0

這個答案需要改進。僅鏈接答案不是很好的答案;考慮在你的答案中包括實質細節。 – 2018-01-09 17:22:19

-1

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

1

如果有人要遵循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 
} 
2

Guidelines from MSDN

  1. 發送WM_QUERYENDSESSION與lParam的設置爲ENDSESSION_CLOSEAPP
  2. 然後用相同的lParam發送WM_ENDSESSION
  3. 如果這不起作用,請發送WM_CLOSE
相關問題