2011-12-14 91 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所述。

相关问题