我有一个应用程序使用低级键盘钩来捕获用户在全局级别选择键盘快捷键以激活应用程序的主窗口。因为我想有时候允许"奇怪"快捷方式,如F12或Ctrl + Ctrl(双击),我使用钩子而不是RegisterHotkey API函数。在Windows 8之前,此功能运行良好。在Windows 8中,某些窗口阻止我的应用程序接收事件,但仅在这些窗口位于前台时。 Windows 8任务管理器就是其中之一。
请注意,因为问题只发生在违规窗口位于前台时,我知道我的挂钩仍然在系统中注册,暂时没有到达我的应用程序。
当前的代码库是C#Framework 4.0;但是,我测试了以前的代码库,它是非托管C ++,问题是一样的。
Windows版本是带有Media Center的8.1 Pro
我还没有尝试的一件事是将钩子程序移动到一个单独的DLL。我想我读过低级键盘钩子程序必须在DLL中,但我从来没有发现这是真的。在我遇到麻烦之前,我想问一下我是否错过了一些更简单,更明显的东西。
答案 0 :(得分:0)
现在我明白了。虽然我的应用程序在Administrators组中的Windows帐户下运行,但需要使用“以管理员身份运行”启动,以避免被UIPI阻止。
至少对我而言,解决方案是让Windows 8最终用户以管理员身份启动我的应用程序,如果他/她想要使用像我在问题中提到的那些“花哨”的全局键盘快捷键。 (我还允许用户使用“简单”快捷方式,这些快捷方式是使用RegisterHotkey()而不是WH_KEYBOARD_LL实现的,因此不会受到UIPI的影响。)