我的主要有两条线,但最后我无法关闭手柄。 我试图找到一个窗口矿井weeper的句柄,然后关闭它,但它不起作用。我有我需要的所有相关内容。
#include <windows.h>
#include <stdio.h>
主中的
HWND wh = FindWindow("Minesweeper", "Minesweeper");
CloseHandle (wh);
在printf
的{{1}}上,我看到该值与spy ++中的值相同。
我收到了错误
&#34;异常地址:0x7c90e4ff&#34;
我错过了什么?
顺便说一句: 如果我改变上面的两行,关闭一个过程的句柄就可以了。
答案 0 :(得分:14)
这里有几个基本问题。首先,您不要使用窗口句柄调用CloseHandle
。这不是那种处理方式。如果您有CloseHandle
但HANDLE
不是HWND
,则可以使用HANDLE
。如果要销毁窗口句柄,则需要调用DestroyWindow
。
然而,DestroyWindow
的{{3}}状态:
线程不能使用DestroyWindow来销毁由不同线程创建的窗口。
所以你也做不到。
您可以做的是向窗口发送WM_CLOSE
消息。这应该足以说服它优雅地结束。
请注意,WM_CLOSE
已发送而非发布。这可以通过documentation:
窗口通过其WindowProc函数接收此消息。
<强>更新强>
John Knoller指出我错误解释了Windows文档,而这些文档并未编写,以涵盖一个应用程序试图关闭另一个应用程序的情况。
约翰的建议是:
事实上,使用
WM_CLOSE
或PostMessage
将SendNotifyMessage
发送给其他流程更明智。如果您使用SendMessage
,如果流程没有提取消息,您将陷入困境。使用WM_SYSCOMMAND
/SCCLOSE
更好,这与单击窗口标题的关闭按钮基本相同。
答案 1 :(得分:6)
不要使用CloseHandle
,CloseWindow
或DestroyWindow
。使用WM_CLOSE
向窗口发送SendMessage
消息。
答案 2 :(得分:4)
Windows句柄(HWND)不是系统句柄(HANDLE)。 CloseHandle()用于系统对象。
考虑PostMessage( wh, WM_CLOSE, 0, 0 );
,this article描述。