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

时间:2014-04-18 19:31:42

标签: c++ winapi

我正在尝试使用Windows API在C ++中编写一个用于PC游戏的机器人。我已设法找到流程HANDLE,其ID,最后找到HWND EnumWindows。我还设法将消息发送到它的窗口(使用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程序员,这对我来说是全新的。我甚至不确定这是否是做这种事的正确方法。

[编辑。]当我最小化/最大化游戏时,我的窗口正确显示一两秒钟。似乎游戏的渲染是在渲染窗口后发生的。任何的想法?消息怎么样?我应该管理他们吗?游戏是否会将消息转发到我的窗口?

2 个答案:

答案 0 :(得分:1)

通过从其他进程运行代码,您不会取得太大成功。跨进程的父/子关系很少有效。特别是如果其他过程不期望它。这不是你轻易接受的。该功能仅作为16位Windows的兼容性而存在。今天没有这种技术的地方。

我觉得你不需要以这种方式让窗户成为父母,这似乎是合理的。如果您不想在其他过程中成为窗口的孩子,请不要这样做。

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

答案 1 :(得分:1)

Windows有thread affinity。这意味着创建窗口的线程将处理该窗口的消息。此外,父子链中的所有窗口都应由同一个线程处理。否则,bad things happen

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

否则,您需要将代码注入游戏可执行文件,并让它在相应的线程上创建窗口。我不推荐这样做。