C++ KeyboardProc返回TRUE导致性能下降

C++ KeyboardProc返回TRUE导致性能下降,c++,windows,winapi,hook,C++,Windows,Winapi,Hook,我正在为游戏的附加组件开发一个界面。我不能使用游戏API(有几个原因,包括代码必须与游戏无关),我需要从用户那里获取键盘输入,因此我决定在满足某些条件时使用键盘挂钩(WHU键盘)来处理用户输入。 问题是,虽然我可以正确地接收和处理输入,但当我的钩子返回TRUE而不是系统返回TRUE时,在让事情按预期进行之前,似乎要花费大量时间(远远超过800毫秒),这是不可接受的,因为它甚至不允许流畅的打字体验。 我必须做到的是阻止关键新闻信息到达WndProc,所以问题是:我能做些什么来实现我的目标,而不会对

我正在为游戏的附加组件开发一个界面。我不能使用游戏API(有几个原因,包括代码必须与游戏无关),我需要从用户那里获取键盘输入,因此我决定在满足某些条件时使用键盘挂钩(WHU键盘)来处理用户输入。
问题是,虽然我可以正确地接收和处理输入,但当我的钩子返回TRUE而不是系统返回TRUE时,在让事情按预期进行之前,似乎要花费大量时间(远远超过800毫秒),这是不可接受的,因为它甚至不允许流畅的打字体验。
我必须做到的是阻止关键新闻信息到达WndProc,所以问题是:我能做些什么来实现我的目标,而不会对游戏性能造成太大的伤害,以至于结果无法接受?
编辑:由于特定要求(使用反切球的游戏可能会在我的代码中产生问题,尽管它与作弊无关),将活动wndproc子类化不是一个选项

  • 首先,您需要将DLL注入目标进程,可以通过钩子,也可以通过

  • 找到感兴趣的窗口句柄

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

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

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

    这种方式不太可靠,一些防病毒和反机器人(例如“warden client”)软件可能不喜欢,调试可能很困难


    不过,它应该可以工作。

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

    如果您想阻止消息到达WndProc,那么您需要使用子类,这样您就能够捕获所有消息并决定是否继续它们的路由

    虽然我不喜欢回答自己的问题,但我已经找到了延误的原因。我测试代码所针对的游戏的消息泵是用while(PeekMessage){GetMessage…}实现的,删除键盘输入消息会导致GetMessage阻塞一段时间。使用PostMessage和WM_NULL有助于防止GetMessage被阻止。

    谢谢你的建议,但正如你指出的,anticheats不会喜欢这个,虽然我这样做不是为了作弊,但我真的无法承担引发误报的后果。键盘钩子的优点是anticheats不会标记它,因为许多程序将其用于合法目的…Windows子类化也被许多程序用于合法目的。是的,即使我处理键盘事件不会对性能造成任何影响(但这对我来说不好,因为我处理的按键不应该由游戏处理),只要返回TRUE就足以导致速度减慢,而返回FALSE就可以了。我已经在两个不同的游戏上用不同的引擎进行了测试,结果是一样的。谢谢,但正如上面所评论的,子类化不是一个选项。