【发布时间】:2012-03-09 22:22:11
【问题描述】:
我正在尝试逆向工程 (OllyDbg) 一个应用程序(游戏),该应用程序(游戏)在其窗口 (D3D) 处于活动状态时禁用(捕获/拦截/阻止)所有全局热键(Ctrl-Alt-Del 除外)。
我的问题是此类应用程序在其窗口处于活动状态时可以通过哪些方式捕获/禁用全局热键(包括 winkey、CTRL+Esc 和其他应用程序中设置的全局热键)?
它似乎使用 DirectInput(如果重要的话)。我看到它没有设置任何低级挂钩 (SetWindowsHookEx)。还可以通过哪些其他方式来完成这样的事情?
观察结果:
- 当应用程序暂停时(当它的窗口仍然处于焦点时),热键在窗口处于焦点时仍然被禁用。将窗口切换到其他东西可以启用它们。切换回暂停的应用程序窗口会再次禁用热键。
- 如果做同样的事情,但在窗口失去焦点后暂停应用程序,然后切换回暂停的窗口,热键完全可以工作。
-
编辑:该应用程序似乎阻止了使用
RegisterHotKey设置的全局热键,但不会禁用任何通过挂钩 (SetWindowsHookEx) 设置的热键。
上面的实验似乎表明它是与窗口相关的一些设置,即使应用程序被暂停也能正常工作。会不会是某种 DirectInput 设置? (尽管我看到的唯一 DINPUT API 函数调用是 DINPUT8.DirectInput8Create。)
我这样做是为了改变这种行为,使其他应用程序的热键在游戏窗口聚焦时照常工作。任何想法和提示表示赞赏。
【问题讨论】:
-
你不能禁用 all 热键 - Ctrl-Alt-Del 总是被系统拦截。
-
@KerrekSB: Not necessarily.
-
你可能会发现 Doom 3 的 windows 部分感兴趣:github.com/TTimo/doom3.gpl/tree/master/neo/sys/win32(有趣的是,他们在那里也禁用了任务管理器,包括 ctrl+alt+del 和 crtl+shift+esc)
-
@Necrolis,很好的链接,谢谢。 Atho 他们use
SetWindowsHookEx来捕获和禁用这些热键,OllyDbg 告诉我这些热键在这种情况下不存在。但也许是/我只是因为某种原因没有找到那个电话(我对此很陌生)。 (如果调试器没有列出它,我怎么能找到它?以某种方式挂钩它?) -
我会看看 IDirectInputDevice8::SetCooperativeLevel()。 DISCL_EXCLUSIVE 和 DISCL_NOWINKEY 标志很有希望。
标签: c++ winapi reverse-engineering hotkeys directinput