c# - 拦截和取消 DirectX 游戏的按键事件

标签 c# c++ directx keystroke

我正在为 DirectX 游戏开发一个小工具,我想阻止用户在一段时间内按下某个键(在本例中为 F12)。

我可以找到很多模拟按键的选项,但是在游戏读取之前将击键归零的选项有哪些?

语言并不重要,尽管我更喜欢 C# 或 C++ 解决方案,或者只是朝着正确的方向轻推 :)

提前致谢!

最佳答案

好消息是,我以前做过这个,所以我可以说这是可能的,而且确实有效。

坏消息是它并不简单。它需要大量复杂的代码,并且可能需要很长时间才能实现,但我会解释如何实现。

DirectX 游戏等应用程序通常 register for raw input . 由于您想阻止键盘事件到达应用程序,因此您需要一种在原始输入和游戏之间插入代码的方法,以便您可以检查原始输入并决定是否允许将其传递给游戏:

所以你想改变流程:

原始输入 --> 游戏

原始输入 --> 你的代码 --> 游戏

在无法访问游戏源代码的情况下,您必须找到一种方法来插入您的代码。

当有可用的键盘输入时,游戏会调用WinAPI函数GetRawInputData ,它将告诉它有关键盘事件的信息。理想情况下,我们想要的是当游戏调用此函数时,它实际上调用我们的代码而不是 WinAPI 函数。然后我们可以决定告诉游戏关于键盘事件的内容,我们可以告诉它我们想要的任何东西(例如忽略 F12)。听起来不错吧?这就是它变得有趣的地方......

我们可以利用 Windows 如何将可执行文件加载到内存中。通常,程序使用(或“导入”)调用其他 DLL 中的函数(例如 User32.dll 中的 GetRawInputData)。当程序加载到内存中时,Windows 将用指向相应 DLL 中的可执行代码的指针填充一个表(导入地址表 (IAT))。这意味着当程序调用该函数时,它会被定向到内存中User32.dll中的可执行代码来运行它。

如果我们可以将我们的一个函数的地址写入/修补到该表中,这样当游戏调用 GetRawInputData 时,它实际上会为我们定向到我们的函数,那不是很好吗处理?我们可以!这称为导入地址表修补。

有个不错的article on it here使用 C++ 中的一些工作代码。您应该首先阅读它以更详细地了解它是如何工作的,然后您可以对其进行修改以满足您的需要。它会起作用,但我知道它可能比您希望的要多(多得多),但本质上您是在破解应用程序,这绝非易事。

这是值得做的,即使只是为了更好地了解幕后的 Windows。

祝你好运!

编辑

正如 Simon 所说,如果游戏不使用原始输入,Windows Hooks 是一种更简单的方法。 DirectX Games 往往是一种特殊情况,因为它们使用特殊方法从用户那里获取输入,所以与标准 Hooks 并不能很好地工作。不过一定要试一试,如果可行的话会容易得多。

关于c# - 拦截和取消 DirectX 游戏的按键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22010018/

相关文章:

c# - 如何使 UWP 应用适合屏幕大小?

c# - 从 Azure IoT 中心获取设备列表

c# - 如何在同一个网站调用一个webservice?

c++ - 以下递归目录搜索和文件打开有什么问题?

c++ - DirectX 9、10、11代码差异学习

c++ - 使用图像的一部分创建 directx9 纹理

c# - Mvc 运行时错误 - 角色管理器功能尚未启用

Linux 新手 C++ 编译

c++ - inferior 停止是因为它收到了来自可调整大小的滚动区域上的操作系统错误的信号

c++ - Directx:Obj文件解析到Index Buffer