首页 > 解决方案 > 挂钩直接输入

问题描述

介绍

有这个旧的全屏 800x600 或窗口模式在线游戏二进制文件,我想使用C++制作一个新的 GUI 。我没有它的源代码。相同的界面经过缩放以占据大部分屏幕作为全屏,同时避免游戏因拉伸到具有不同分辨率的显示器而失真,此外还允许在保持原生分辨率的同时切换应用程序。到目前为止,我已经成功地用缩放的窗口游戏窗口内容制作了一个窗口绘制,并将它的键盘输入和所有窗口激活消息重定向到后台的窗口游戏窗口中。我目前正在努力发送重新映射的光标位置和点击。

我的尝试

我第一次尝试发送WM_MOUSEMOVE消息,但发现游戏使用直接输入。使用 Process Explorer暂停或终止dinput8.dll!GetdfDIJoystick+0x61c8游戏线程会阻止游戏对鼠标输入做出反应。

这个StackOverflow 答案指出:

...值得注意的是,在最新版本的 Windows 中,用于鼠标和键盘输入的 DirectInput 只是 Win32 Windows 消息的包装器...

...所以我也尝试拦截该线程消息。我使用 Spy++ 检查了一个名为DIEmWin的窗口,它似乎是由 Direct Input 生成并属于游戏进程,并看到它正在接收WM_INPUT消息。我在它的线程中安装了一个WH_GETMESSAGE钩子,并停止了这些消息以避免它们的CallNextHookEx()调用。用 Spy++ 重新钩住同一个窗口显示没有WM_INPUT收到更多消息,但游戏仍在对鼠标输入做出反应。然后我尝试在其WH_MOUSE_LL上添加一个钩子,尽管 Spy++ 没有显示与该线程相关的消息,以防万一。游戏仍然对鼠标输入做出反应。

我的问题

如何在不使用弯路的情况下重新映射光标位置?我希望通过挂钩这个理论上的 Direct Input 包装器来实现我的目标,从而避免将汇编代码注入游戏 Direct X 8 调用的需要。我相信我已经成功拦截了所有这些包装消息,但游戏无论如何都会对输入做出反应。

一些注意事项

标签: c++winapihookdetoursdirectinput

解决方案


推荐阅读