如何从远程线程DestroyWindow?

时间:2017-08-24 04:49:45

标签: c++ c windows multithreading winapi

执行一些dll注入并需要销毁某个窗口。但是,DestroyWindow仅在创建窗口的同一线程调用它时才有效。否则失败,错误5:拒绝访问。

我想也许我可以通过获取它的线程ID(DWORD dwTid = GetWindowThreadProcessId)来欺骗它以认为我是创建线程,然后将当前线程的线程id设置为它:__writefsdword(0x24, dwTid)但是它仍然失败,错误5,拒绝访问。

经过一些谷歌搜索后,我还没有找到答案。

顺便说一句:我知道我可以发送WM_DESTROY,但出于好奇和需要解决问题,我想知道如何使用DestroyWindow

1 个答案:

答案 0 :(得分:5)

要调用DestroyWindow(),您必须注入在创建窗口的线程的上下文中运行的代码。使用GetWindowThreadProcessId()获取窗口拥有的线程ID,然后使用SetWindowsHookEx()在该线程中安装消息钩子,最后发送/发送任何消息到窗口。当钩子回调接收到消息时,它将在窗口的线程的上下文中运行,因此可以在窗口上调用DestroyWindow()HWND被提供给钩子回调) 。