我的应用程序使用RegisterHotKey()
WinAPI函数为PrtScr注册了一个热键。
在大多数情况下,它工作正常,并被我的应用程序捕获。但是,如果一些应用程序在屏幕上变得活跃,那么这个热键就不会被捕获。同时,如果我切换到另一个应用程序,它可以工作。
我在任务管理器,Chrome浏览器和其他一些浏览器中观察到这样的问题。有时它甚至不能在一个Chrome应用程序窗口上工作,但同时在另一个Chrome窗口上工作得很好。
我还观察到使用PrtScr作为热键的其他应用程序也存在同样的问题,因此似乎问题不在我的应用程序中。但我还是不明白这背后的逻辑。
如果有人知道PrtScr在这种情况下被阻塞的原因,我将非常感谢你分享你的知识。
它应该工作在Chrome(除非你运行Chrome与提升特权?不知道它是否在一个窗口上工作,然后在另一个窗口上失败)。在任务管理器上失败是由于用户界面特权隔离(UIPI)的设计。使用UIPI,RegisterHotKey
和LowLevelKeyboardProc
在任务管理器或其他具有更高权限的程序上都将失败。
请阅读微软文档。您可以以管理员身份运行应用程序,或者通过签名应用程序并将其放在受保护的位置来正确配置UIAccess
标志。
用户界面特权隔离(UIPI)在Windows子系统中实现限制,防止低权限应用程序在高权限进程中发送消息或安装钩子。高权限的应用程序可以向低权限的进程发送消息。ui不会干扰或改变具有相同权限(或完整性)级别的应用程序之间的消息行为。
此策略设置强制要求通过在应用程序清单中标记UIAccess=true来请求以UIAccess完整性级别运行的应用程序必须位于文件系统的安全位置。相对安全的位置仅限于以下目录:
..Program Files (and subfolders)
..Program Files (x86) (and subfolders, in 64-bit versions of Windows only)
..WindowsSystem32