KeyboardProc返回TRUE会导致性能下降

时间:2009-06-27 15:07:58

标签: c++ windows winapi hook

我正在开发一个游戏附加组件的界面。我不能使用游戏API(由于几个原因,包括代码必须与游戏无关),我需要从用户那里获得键盘输入,所以我决定使用键盘钩子(WH_KEYBOARD)来处理用户在满足某些条件时输入 问题是,虽然我可以正确地接收和处理输入,但当我的钩子返回TRUE而不是CallNextHookEx时,系统似乎占用了大量的时间(远超过800毫秒),然后让事情按预期继续进行,那就是不可接受,因为它甚至不允许流体打字经验 我必须达到的目的是阻止按键消息到达WndProc,所以问题是:如何在不损害游戏性能的情况下实现目标,结果将是不可接受的?
编辑:由于特定要求(使用可能会导致我的代码出现问题的反加热游戏,尽管它没有与作弊相关)继承活动的wndproc不是一种选择。

4 个答案:

答案 0 :(得分:2)

  1. 首先,您需要通过挂钩或any other way将DLL注入目标进程。

  2. 找到感兴趣的窗口句柄。

  3. 通过调用GetWindowLongPtr(wnd,GWLP_WNDPROC)获取该窗口的当前窗口过程,并保存。

  4. 通过调用SetWindowLongPtr(wnd,GWLP_WNDPROC和& NewWndProc)对窗口进行子类化,其中NewWndProc是您实现DLL的消息过程。

  5. 在NewWndProc内部,您需要处理键盘消息(其中有十几个,在MSDN索引中键入“键盘输入”,我不能发布超过1个链接)。对于其余的Windows消息,调用您在(3)期间保存的原始窗口过程,并返回它返回的值。不要直接调用它,而是使用CallWindowProc。

    这种方式不太可靠,某些防病毒软件和反僵尸程序(例如“warden客户端”)软件可能不喜欢它,调试可能具有挑战性。

    然而它应该有用。

答案 1 :(得分:0)

键盘挂钩不应该让事情变慢。可能还有其他事情会导致800毫秒的延迟。如果你的钩子什么都不做而且只是返回TRUE,它仍然很慢吗?

答案 2 :(得分:0)

如果你想阻止消息到达WndProc,那么你需要使用SetWindowLong进行子类化,这样你就可以捕获所有消息并决定是否继续他们的路由。

答案 3 :(得分:0)

尽管我不喜欢回答我自己的问题,但我发现了延迟的原因。我测试过我的代码的游戏的消息泵是用一段时间(PeekMessage){GetMessage ...}实现的,删除键盘输入消息以某种方式导致GetMessage阻塞了一段时间。使用PostMessage和WM_NULL有助于阻止GetMessage阻塞。