c++ - 挂钩直接输入
问题描述
介绍
有这个旧的全屏 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 调用的需要。我相信我已经成功拦截了所有这些包装消息,但游戏无论如何都会对输入做出反应。
一些注意事项:
重定向的键盘输入可能不存在并且正在发生,因为游戏窗口在后台接收激活消息并且直接输入按原样获取键盘输入。
我无法获得免费签署司机的方式。
解决方案
推荐阅读
- python - Format() 返回字符串不是数字?
- python - 在数据框的不同部分应用函数
- python - 如何将bale bot中的本地文件发送给客户端?
- sql - 如何使用 SQL 列出缺失的数值
- angular - 升级到 Angular 6 后出错:无法重新声明块范围变量“ngDevMode”
- perl - Perl - Win32::Gui - 确定具有焦点的文本字段的文本内容
- php - Facebook PHP API 将回溯元素发布到页面
- perl - FIFO 队列上的 Amazon::SQS::Simple MessageGroupId
- google-apps-script - 在 Gmail 主界面中添加一个带有插件的按钮
- plotly - 使用 plotly 将图形直接保存到所选目录