【问题标题】:Prevent other windows from "overriding" hotkeys with the windowsAPI使用 windowsAPI 防止其他窗口“覆盖”热键
【发布时间】:2014-05-23 01:31:58
【问题描述】:

我正在尝试通过编写一个程序来学习 Windows API 的基础知识,当按下 PRINTSCREEN 按钮时,该程序将保存 .jpeg 并立即将其上传到 imgur。目前,当我在玩大多数游戏或只是浏览桌面时,这个程序运行良好。

但是,有些游戏似乎阻止了我使用此热键的能力。 (黑暗之魂 2 专门这样做。)我目前使用

RegisterHotKey(NULL, 1, 0, VK_SNAPSHOT)

将按钮分配给我的程序。但是,在某些游戏运行时,按键按下时,上面的RegisterHotKey和下面的GetAsyncKeyState都不起作用。

GetAsyncKeyState(VK_SNAPSHOT)

(我不想使用 GetAsyncKeyState ,因为它会不断干扰 windows API 并使程序不必要地变慢,这只是为了测试。)

有人知道阻止这种情况发生的方法吗?

(并且,在不相关的说明中:如果这是一项简单的任务,我将如何截取跨多个显示器的屏幕截图?我目前仅在我的主显示器上工作......)

【问题讨论】:

  • 我在 Windows 7 上。但如果您也知道如何在其他版本的 Windows 上解决此问题,我们将不胜感激!我正在尝试一次尽可能多地学习。
  • 我认为您可以使用Ctrl-PrtScn 获得跨多个显示器的屏幕截图。
  • 作为一种远程可能性,您可以尝试将GlobalAddAtom 用于id 用于RegisterHotKey。请参阅此处备注部分的最后一段:msdn.microsoft.com/en-us/library/windows/desktop/…
  • ooga,我知道你可以得到一个这样的,但是你如何从 windows API 进行相应的调用呢?这是最难的部分 :) 我现在试试GlobalAddAtom
  • GlobalAddAtom 不能作为id 传递给RegisterHotKey 函数

标签: c++ windows winapi


【解决方案1】:

如果应用程序使用raw input 进行键盘映射,则键盘处理代码会绕过热键检查器。我个人不知道 Dark Souls 是否这样做,但我熟悉执行键盘处理的 Windows 内核代码。

【讨论】:

  • 这并不能解释 GetAsyncKeyState() 的问题。这是一款多人游戏。他们总是内置了 PunkBuster 风格的反作弊功能,这样一些作弊者就不会毁掉其他人的游戏。
  • 那么以我想要的方式获得键盘输入可能“不可能”或不可行?
  • @HansPassant 我必须仔细检查来源; IIRC GetAsyncKeyState 也可以通过原始输入绕过。
  • @user2899162 是的,如果应用程序在足够低的级别拦截键盘输入流,则不会完成更高级别的键盘处理(热键、窗口消息等)。因此,并非总是能够执行您要求的任务。
  • 我很确定 GetAsyncKeyState() 实际上会查询键盘驱动程序,因此它不会被原始输入绕过。但是应用程序可以以独占模式获取键盘,这将阻止任何其他应用程序接收键盘输入。
猜你喜欢
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 2010-09-16
  • 1970-01-01
  • 2010-09-22
  • 2015-05-05
  • 1970-01-01
相关资源
最近更新 更多