2010-01-13 100 views
32

我想終止許多進程,但我想讓每個進程都有機會保存它的數據,詢問用戶保存文件甚至忽略關閉請求。如何正常終止進程?

所以TerminateProcess是不可能的,因爲它立即殺死過程。另一種方法是使用SendMessage/PostMessage發送一個WM_CLOSE到主窗口,不幸的是我不知道任何有關進程的窗口,我只有進程ID,所以FindWindow也沒有幫助。有沒有其他的方法來找到一個過程的主窗口?

換句話說: 有什麼辦法終止任何過程正常,就像任務管理器,當你點擊「結束任務」? (而不是「結束進程」)

+0

我認爲 「任務」 是頂層(可視)窗口。所以,'WM_CLOSE'將被髮送(可能)在終止任務上。 – 2010-01-13 10:45:55

+0

如果您不是軟件開發人員 - 只是Windows用戶 - 請參閱[相關超級用戶如何正常詢問正在運行的應用程序終止問題](http://superuser.com/questions/959364/on-windows-如何-可以-I-優雅-ASK-A-進程到終止)。 – unforgettableid 2015-08-19 02:33:21

+0

請注意,從Windows 8.1起,任務管理器的「結束任務」按鈕現在強行終止所選應用程序,並導致您丟失任何未保存的工作。你可能想編輯你的問題,以反映這一點。 – unforgettableid 2015-08-20 12:44:41

回答

22

EnumWindows枚舉進程中的所有頂級窗口。 GetWindowThreadProcessId獲取每個線程的進程和Id。

您現在有足夠的信息來正常關閉任何GUI應用程序。

您可以發送WM_CLOSE消息到任何您想關閉的窗口。許多窗口處理WM_CLOSE以提示用戶保存文檔。您可以使用PostThreadMessage發送WM_QUIT消息到發現的線程,以使消息循環終止。

用戶代碼不允許調用DestroyWindow從不同的應用程序或線程到Windows ...如果應用程序不給你回TerminateProcess土地WM_CLOSEWM_QUIT請求作出迴應。

這不會關閉控制檯應用程序,因爲應用程序進程和擁有該窗口的進程是不同的。

沒有真正的方法可以在Windows上優雅地關閉控制檯應用程序。他們需要支持某種優雅的關閉機制。

+0

當我擁有該進程的所有窗口時,是否會向每個頂級窗口發送一個「WM_CLOSE」? – 2010-01-13 10:08:09

+0

正是我要說的。 +1。 – 2010-01-13 10:09:04

+2

是的 - TaskManager發送一個WM_CLOSE消息給應用程序。其實我認爲它可能會發送一個'WM_SYSCOMMAND','SC_CLOSE'消息。 – 2010-01-13 13:13:09

15

我對win32 apis不太確定,但是你可以執行命令行的taskkill命令行功能。

taskkill /? 
taskkill /pid 1230 
taskkill /im notepad.exe 

/f開關會強制終止但不使用它只是發送終止信號,以便應用程序正常關閉。

+4

不幸的是,這隻適用於Windows XP Professional或更新版本。 (甚至沒有家XP),但我也需要Windows 2000和XP Home的功能。但我很想看到該工具的源代碼:) – 2010-01-13 10:09:46

13
+0

+1。克里斯貝克的解決方案重疊了很多,並介紹了處理16位應用程序的角落案例。尼斯。 – 2010-01-15 02:57:35

+9

你也應該在這裏寫一些內容,以防止頁面被移動/移動。 – MasterMastic 2013-04-02 14:58:45

+0

鏈接只有答案不是很好的答案。請按照MasterMastic的建議去做,並將實質性內容放在這個答案中。 – 2018-01-08 17:17:54

1

使用EndTask API函數。這與任務管理器使用的功能相同。

BOOL EndTask(  
    HWND hWnd, 
    BOOL fShutDown, 
    BOOL fForce 
); 

http://msdn.microsoft.com/en-us/library/ms633492(VS.85).aspx

+7

該頁面第一行文字說:* [此功能不適合一般用途。在Windows的後續版本中可能會更改或不可用。] *。也許upvoters沒有點擊通過? – Jon 2011-06-26 22:59:42

+2

@Jon很多api都有這樣的提示,但許多問題不能在不使用它們的情況下解決。這同樣適用於「無證」的。 (我不是說這是這種情況之一) – 2014-10-17 12:02:58