为什么我不能在代码中关闭窗口句柄?

时间:2011-12-14 15:42:31

标签: c winapi

我的主要有两条线,但最后我无法关闭手柄。 我试图找到一个窗口矿井weeper的句柄,然后关闭它,但它不起作用。我有我需要的所有相关内容。

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

中的

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

printf的{​​{1}}上,我看到该值与spy ++中的值相同。

我收到了错误

  

&#34;异常地址:0x7c90e4ff&#34;

我错过了什么?

顺便说一句: 如果我改变上面的两行,关闭一个过程的句柄就可以了。

3 个答案:

答案 0 :(得分:14)

这里有几个基本问​​题。首先,您不要使用窗口句柄调用CloseHandle。这不是那种处理方式。如果您有CloseHandleHANDLE不是HWND,则可以使用HANDLE。如果要销毁窗口句柄,则需要调用DestroyWindow

然而,DestroyWindow的{​​{3}}状态:

  

线程不能使用DestroyWindow来销毁由不同线程创建的窗口。

所以你也做不到。

您可以做的是向窗口发送WM_CLOSE消息。这应该足以说服它优雅地结束。

请注意,WM_CLOSE已发送而非发布。这可以通过documentation

中的这一行来辨别
  

窗口通过其WindowProc函数接收此消息。

<强>更新

John Knoller指出我错误解释了Windows文档,而这些文档并未编写,以涵盖一个应用程序试图关闭另一个应用程序的情况。

约翰的建议是:

  

事实上,使用WM_CLOSEPostMessageSendNotifyMessage发送给其他流程更明智。如果您使用SendMessage,如果流程没有提取消息,您将陷入困境。使用WM_SYSCOMMAND / SCCLOSE更好,这与单击窗口标题的关闭按钮基本相同。

答案 1 :(得分:6)

不要使用CloseHandleCloseWindowDestroyWindow。使用WM_CLOSE向窗口发送SendMessage消息。

答案 2 :(得分:4)

Windows句柄(HWND)不是系统句柄(HANDLE)。 CloseHandle()用于系统对象。

考虑PostMessage( wh, WM_CLOSE, 0, 0 );this article描述。