挂钩直接输入

时间:2019-11-30 16:54:28

标签: c++ winapi hook detours directinput

简介

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

我的尝试

我首先尝试发送WM_MOUSEMOVE消息,但发现游戏使用直接输入。使用Process Explorer暂停或杀死 dinput8.dll!GetdfDIJoystick + 0x61c8 游戏线程,使游戏无法响应鼠标输入。

This 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调用中。

一些注释

  • 重定向的键盘输入可能不存在,因为游戏窗口在后台收到激活消息,而Direct Input却按原样获得键盘输入。

  • 我无法免费获得签署驱动程序的方式。

0 个答案:

没有答案