2011-12-14 58 views
6

我在我的主要中有這兩行,但最後我無法關閉句柄。 我想獲得Windows礦井哭泣的句柄,然後關閉它,但它不起作用。我有我需要的所有相關內容。爲什麼我不能關閉我的代碼中的窗口句柄?

#include <windows.h> 
#include <stdio.h> 
在主

HWND wh = FindWindow("Minesweeper", "Minesweeper"); 
CloseHandle (wh); 

wh我看到的值printf

是相同的這在間諜++提高。

而我得到的錯誤

「異常地址:0x7c90e4ff」

我缺少什麼?

順便說一句: 關閉如果我改變上面的兩行,一個進程的句柄工作正常。

+0

當你調用CloseHandle時`wh` null嗎? – 2011-12-14 15:47:13

回答

14

這裏有幾個基本問​​題。首先你不要撥打CloseHandle帶窗戶把手。這不是那種處理。當您有HANDLE時,您使用CloseHandle,但HWND不是HANDLE。如果你想銷燬一個窗口句柄,你需要撥打DestroyWindow

然而,documentationDestroyWindow狀態:

的線程不能調用DestroyWindow銷燬由不同的線程創建的窗口。

所以你不能這樣做。

你可以做的是發送一個WM_CLOSE消息到窗口。這應該足以說服它優雅地關閉。

請注意,發送WM_CLOSE而不是發佈。這可以通過documentation這一行來辨別:

一個窗口通過它的WindowProc函數接收這個消息。

更新

約翰Knoller指出,我誤解這是不寫入涵蓋一個應用程序試圖關閉其他應用程序的情況Windows文檔。

約翰的建議是:

事實上它是明智的發送WM_CLOSE使用PostMessageSendNotifyMessage另一個進程。如果您使用SendMessage,如果進程沒有泵送消息,則會卡住。使用WM_SYSCOMMAND/SCCLOSE更好,這與單擊窗口標題的關閉按鈕基本相同。

6

不要使用CloseHandle,CloseWindowDestroyWindow。使用SendMessage發送WM_CLOSE消息到窗口。

+0

爲什麼不發佈`WM_CLOSE`? – Deanna 2011-12-14 15:49:57

+0

@Deanna PostMessage也很好。我通常使用SendMessage的原因是,它等待目標窗口的窗口過程來處理消息。因此,在SendMessage返回後,您可以立即檢查目標窗口是否真的關閉。 – kol 2011-12-14 15:52:45

+0

這不就是一個與CloseWindow()類似的替代方案嗎? – Lundin 2011-12-14 15:53:22

4

Windows句柄(HWND)不是系統句柄(HANDLE)。 CloseHandle()用於系統對象。

考慮PostMessage(wh, WM_CLOSE, 0, 0);,如this article所述。

相關問題