我正在尝试使用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程序员,这对我来说是全新的。我甚至不确定这是否是做这种事的正确方法。
[编辑。]当我最小化/最大化游戏时,我的窗口正确显示一两秒钟。似乎游戏的渲染是在渲染窗口后发生的。任何的想法?消息怎么样?我应该管理他们吗?游戏是否会将消息转发到我的窗口?
答案 0 :(得分:1)
通过从其他进程运行代码,您不会取得太大成功。跨进程的父/子关系很少有效。特别是如果其他过程不期望它。这不是你轻易接受的。该功能仅作为16位Windows的兼容性而存在。今天没有这种技术的地方。
我觉得你不需要以这种方式让窗户成为父母,这似乎是合理的。如果您不想在其他过程中成为窗口的孩子,请不要这样做。
如果你确实需要它成为另一个过程的孩子,那么你可能遇到麻烦。也许你可以将DLL注入另一个进程并在那里创建窗口。也不是没有困难。
答案 1 :(得分:1)
Windows有thread affinity。这意味着创建窗口的线程将处理该窗口的消息。此外,父子链中的所有窗口都应由同一个线程处理。否则,bad things happen。
那么 - 你的代码是如何运行的?如果它是一个单独的可执行文件,那么将窗口保留为顶级窗口会更好,只需监视移动事件的目标窗口(例如,使用UI Automation)让你的窗户适当移动。
否则,您需要将代码注入游戏可执行文件,并让它在相应的线程上创建窗口。我不推荐这样做。