我有这两行在我的主要,但我不能关闭句柄在结束。我试图得到一个句柄到windows地雷哭泣,并关闭它之后,但它不工作。我有所有相关的包括我需要的。
#include <windows.h>
#include <stdio.h>
大体上
HWND wh = FindWindow("Minesweeper", "Minesweeper");
CloseHandle(wh);
在wh
的printf
上,我看到值与spy++中的值相同。
我得到的错误
“异常地址:0x7c90e4ff”的数据类型
我错过了什么?
顺便说一句:如果我改变上面的两行,进程的关闭句柄就可以正常工作。
5条答案
按热度按时间rryofs0p1#
这里有几个基本问题。首先,你不能用窗口句柄调用
CloseHandle
。它不是那种句柄。当你有一个HANDLE
,但一个HWND
不是HANDLE
时,你可以使用CloseHandle
。如果你想销毁一个窗口句柄,你需要调用DestroyWindow
。然而,documentation对于
DestroyWindow
的状态为:线程不能使用DestroyWindow销毁由其他线程创建的窗口。
所以你也不能这么做。
你能做的就是向窗口发送一条
WM_CLOSE
消息,这应该足以说服它优雅地关闭。请注意,
WM_CLOSE
是发送的而不是发送的。这可以通过documentation中的这一行来识别:窗口通过其WindowProc函数接收此消息。
更新
John Knoller指出,我误解了Windows文档,该文档不是为了涵盖一个应用程序试图关闭另一个应用程序的情况而编写的。
约翰的建议是:
实际上,使用
PostMessage
或SendNotifyMessage
将WM_CLOSE
发送到另一个进程是更明智的。如果使用SendMessage
,那么如果进程不发送消息,你就会被卡住。使用WM_SYSCOMMAND
/SCCLOSE
更好,这基本上和点击窗口标题的关闭按钮是一样的。lndjwyie2#
不要使用
CloseHandle
、CloseWindow
或DestroyWindow
。使用SendMessage
将WM_CLOSE
消息发送到窗口。tez616oj3#
Windows句柄(HWND)不是系统句柄(HANDLE)。CloseHandle()用于系统对象。
考虑
PostMessage( wh, WM_CLOSE, 0, 0 );
,如this article所描述的。kxkpmulp4#
对我来说,
EndModal
是一个可行的解决方案:ocebsuys5#
如果你想关闭某个进程的特定子窗口,而不是用
WM_CLOSE
杀死整个进程,你可以inject your code into another process并从那里调用DestroyWindow
。这也可以让你关闭那些专门忽略WM_CLOSE
消息或不响应的窗口。