在另一个应用程序中创建一个子窗口

Create a child window inside another application

本文关键字:一个 窗口 另一个 应用程序 创建      更新时间:2023-10-16

我正在尝试使用windows API用C++为PC游戏编写机器人程序。我设法找到了进程HANDLE,它的ID,最后找到了它的带有EnumWindowsHWND。我还设法将消息发送到它的窗口(使用SendMessage),以便模拟击键。由于游戏是全屏运行的,我想在里面创建一个带有自定义控件的子窗口,以便轻松打开/关闭机器人,但我遇到了问题。我试图注册一个窗口类,并创建一个以游戏的HWND为父窗口的窗口,但我什么都看不到。这是我用来创建子窗口的代码(不起作用):

// ... Window class registering etc...
HWND hChild = CreateWindowEx(0, 
                             "MyWindowClass", 
                             "Title", 
                             WS_CHILD | WS_VISIBLE, 
                             0, 0, 100, 100, 
                             hParent, 
                             NULL, 
                             AHInstance, 
                             NULL); // Parent is a valid window handle from another process

老实说,我不是一个熟练的windows API程序员,这一切对我来说都是新的。我甚至不确定这是否是做这件事的正确方法。

[编辑]当我最小化/最大化游戏时,我的窗口会正确显示一两秒钟。游戏的渲染似乎是在我的窗口渲染之后进行的。知道吗?那么信息呢?我该管还是不该管?游戏会将消息转发到我的窗口吗?

从不同的进程运行代码不会有多大成功。跨流程的父/子关系很少起作用。尤其是在其他过程没有预料到的情况下。这不是你掉以轻心的事情。该功能仅作为16位Windows的兼容性sop存在。今天没有这种技术的容身之地。

在我看来,你不需要以这种方式为窗口设置家长似乎是合理的。如果你不需要它在另一个过程中成为一个窗口的孩子,不要这样做。

如果你确实需要它作为另一个过程的孩子,那么你可能会有麻烦。也许您可以将DLL注入到另一个进程中,并在那里创建窗口。也并非没有困难。

Windows具有线程亲和性。这意味着创建窗口的线程将处理该窗口的消息。此外,父子链中的所有窗口都应该由同一个线程处理。否则,坏事就会发生。

那么,你的代码是如何运行的?如果它是一个单独的可执行文件,那么最好将窗口作为顶级窗口,只需监控目标窗口的移动事件(例如使用UI Automation),并使窗口适当移动。

否则,您将需要将代码注入到游戏可执行文件中,并让它在适当的线程上创建窗口。我不建议那样做。