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

0x9*_*x90 6 c winapi

我的主要是这两条线,但最后我无法关闭手柄.我试图获得一个窗口矿井weeper的句柄,然后关闭它,但它不起作用.而且我有我需要的所有相关内容.

#include <windows.h>
#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)

在主要

HWND wh = FindWindow("Minesweeper", "Minesweeper");
CloseHandle (wh);
Run Code Online (Sandbox Code Playgroud)

printfwh我看到的价值等同于本次募集间谍++.

我收到了错误

"异常地址:0x7c90e4ff"

我错过了什么?

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

Dav*_*nan 14

这里有几个基本问​​题.首先,你不要CloseHandle使用窗口句柄调用.这不是那种处理方式.CloseHandle当你有a HANDLEHWND不是a 时,你会使用HANDLE.如果你想破坏你需要调用的窗口句柄DestroyWindow.

然而,该文件DestroyWindow状态:

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

所以你也做不到.

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

请注意,WM_CLOSE发送而不是发布.从文档中可以看出这一行:

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

更新

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

约翰的建议是:

事实上,WM_CLOSE使用PostMessage或发送到另一个进程更明智SendNotifyMessage.如果你使用SendMessage,如果这个过程没有抽取信息,你就会陷入困境.使用WM_SYSCOMMAND/ 更好,SCCLOSE这与单击窗口标题的关闭按钮基本相同.

  • 你误读了最后一行.事实上,使用PostMessage或SendNotifyMessage将WM_CLOSE发送到另一个进程是明智的.如果使用SendMessage,如果进程没有引发消息,则会卡住.使用WM_SYSCOMMAND/SCCLOSE甚至更好,这与单击窗口标题的关闭按钮基本相同. (3认同)

kol*_*kol 6

不要使用CloseHandle,CloseWindowDestroyWindow.使用发送WM_CLOSE消息到窗口SendMessage.