2016-11-21 38 views
-1

我想從我的應用程序關閉一些應用程序的窗口。我試圖發送WM_CLOSE消息到該窗口(並且它對一些窗口來說是完美的),但有些窗口忽略了WM_CLOSE。然後我發現this文章說,如果我想關閉窗口,我可以調用DestroyWindow WINAPI函數。但是,根據documentation,「一個線程不能使用DestroyWindow銷燬由另一個線程創建的窗口」。所以我不能使用它從我的應用程序關閉另一個應用程序的窗口。忽略WM_CLOSE的關閉窗口?

所以我的問題是 - 是否可以關閉應用程序窗口,忽略WM_CLOSE消息?我確實要關閉窗口(例如彈出窗口),不要退出應用程序,不要關閉與該窗口相關的線程等。

編輯: 我確信,該​​窗口故意忽略了我的WM_CLOSE,因爲我通過諜照看到++,它收到我的WM_CLOSE消息。我不想實現「點擊右上角[X]按鈕」,因爲我想要統一的解決方案(我有問題的窗口根本沒有按鈕[X])。

回答

-2

有幾個原因窗口被忽略了您的WM_CLOSE:

  1. 窗口可能會故意忽略WM_CLOSE,因爲它自己的邏輯認爲,窗口無法關閉。 (例如,它仍在等待用戶在所有編輯字段中輸入文本)。如果您強制關閉窗口,則可能會導致應用程序本身出現未定義的行爲。

  2. 你沒有說你是如何獲得有問題的窗口句柄(HWND)。這可能值得研究,因爲你的代碼可能有錯誤。

作爲最後的手段,你總是可以實現鼠標光標移動到窗口的右上角,並模擬上[X]關閉按鈕上方的鼠標點擊代碼。或者單擊該窗口將其置於前臺並通過SendInput

+0

對不起,意外按下輸入。 1.我知道肯定,那個窗口故意忽略我的WM_CLOSE,正如我通過spy ++看到它接收到我的WM_CLOSE消息。該窗口右上角沒有[X]關閉按鈕,該窗口有自己的「關閉」按鈕(不在右上角)。但我想要統一的解決方案,這將適用於所有可能的窗口。 2.我通過'SetWinEventHook'函數獲取窗口句柄(查找'EVENT_OBJECT_CREATE'事件)。而且我可以驗證句柄是否正確,因爲我還使用spy ++檢查了這個 –

+0

確切地說,它是一個自定義窗口,並具有自己的邏輯來確定如何銷燬它自己。在這種情況下,這很簡單。你需要模擬用戶點擊那個按鈕。 – selbie

+0

downvoter會關心解釋他不喜歡什麼? – selbie

1

注入ALT+F4按鍵WM_CLOSE是關閉遵循標準規則的窗口的標準方式。顯然你的目標窗口不是,所以標準的解決方案將無法工作。

雖然有一個可能的選擇。正如您已經發現的那樣,只有擁有該窗口的線程才能銷燬該窗口。所以你必須讓擁有者線程銷燬窗口。您可以使用GetWindowThreadProcessId()來獲取目標窗口的擁有線程ID,然後使用SetWindowsHookEx()在該線程中安裝線程特定的消息鉤子(鉤子回調必須在DLL中實現),然後最終將自定義窗口消息發送到目標窗口。當消息鉤子收到消息時,它將在窗口擁有線程的上下文中運行,從而可以銷燬該窗口。