C语言 为什么我无法在代码中关闭窗口句柄?

i2byvkas  于 2022-12-03  发布在  其他
关注(0)|答案(5)|浏览(1108)

我有这两行在我的主要,但我不能关闭句柄在结束。我试图得到一个句柄到windows地雷哭泣,并关闭它之后,但它不工作。我有所有相关的包括我需要的。

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

大体上

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

whprintf上,我看到值与spy++中的值相同。
我得到的错误
“异常地址:0x7c90e4ff”的数据类型
我错过了什么?
顺便说一句:如果我改变上面的两行,进程的关闭句柄就可以正常工作。

rryofs0p

rryofs0p1#

这里有几个基本问题。首先,你不能用窗口句柄调用CloseHandle。它不是那种句柄。当你有一个HANDLE,但一个HWND不是HANDLE时,你可以使用CloseHandle。如果你想销毁一个窗口句柄,你需要调用DestroyWindow
然而,documentation对于DestroyWindow的状态为:
线程不能使用DestroyWindow销毁由其他线程创建的窗口。
所以你也不能这么做。
你能做的就是向窗口发送一条WM_CLOSE消息,这应该足以说服它优雅地关闭。
请注意,WM_CLOSE是发送的而不是发送的。这可以通过documentation中的这一行来识别:
窗口通过其WindowProc函数接收此消息。

更新

John Knoller指出,我误解了Windows文档,该文档不是为了涵盖一个应用程序试图关闭另一个应用程序的情况而编写的。
约翰的建议是:
实际上,使用PostMessageSendNotifyMessageWM_CLOSE发送到另一个进程是更明智的。如果使用SendMessage,那么如果进程不发送消息,你就会被卡住。使用WM_SYSCOMMAND/SCCLOSE更好,这基本上和点击窗口标题的关闭按钮是一样的。

tez616oj

tez616oj3#

Windows句柄(HWND)不是系统句柄(HANDLE)。CloseHandle()用于系统对象。
考虑PostMessage( wh, WM_CLOSE, 0, 0 );,如this article所描述的。

kxkpmulp

kxkpmulp4#

对我来说,EndModal是一个可行的解决方案:

HWND hWnd = GetWindow(Handle, GW_ENABLEDPOPUP);
EndDialog(hWnd, IntPtr.Zero);
ocebsuys

ocebsuys5#

如果你想关闭某个进程的特定子窗口,而不是用WM_CLOSE杀死整个进程,你可以inject your code into another process并从那里调用DestroyWindow。这也可以让你关闭那些专门忽略WM_CLOSE消息或不响应的窗口。

相关问题