我正在为 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/