在uiAccess = true的UAC进程中,Keyboard.IsKeyDown为false?

时间:2018-05-09 04:27:56

标签: c# wpf uac

我有一个程序试图将自己安装在清单中Keyboard.IsKeyDown的目标计算机上。

以下是有关该文件的文件:https://msdn.microsoft.com/en-us/library/windows/desktop/ee671610(v=vs.85).aspx

根据文档,这应该授予应用程序权限,以便在UAC提升的应用程序成为焦点时执行更多操作。

但是,只要管理应用程序成为焦点,false就会为任何实际关闭的密钥返回uiAccess

这让我相信C:\Program Files\Shapeshifter事实上并没有起作用。

这是我确定发生的事情:

  • 根据Comodo的文档,我的程序使用代码签名证书进行签名。它不是EV证书。
  • 该程序是从受UAC保护的路径(uiAccess)启动的。

如何调试{{1}}并弄清楚它无效的原因?

1 个答案:

答案 0 :(得分:3)

  

如何调试uiAccess

可调试的唯一真实内容是验证操作系统是否检测到您要求它。很容易做到你可能已经做过的事情:不要签署可执行文件。期望您现在无法再启动EXE。如果它确实启动,那么你知道UIPI没有被禁用的事实。

  

Keyboard.IsKeyDown返回false

这是预期的行为以及禁用UIPI无法解决的问题。此WPF属性使用引擎盖下的GetKeyState()。相当臭名昭着的功能,很多受害者和很少有用的答案。键盘状态和输入处理是按进程进行的(技术上是每个输入队列),只有在前台有窗口的进程才能看到按键。修复需要使用Raymond Chen喜欢讨厌的winapi函数,AttachThreadInput()。期望UIPI禁用它不再失败,错误5(也称拒绝访问)。

除了Raymond的担忧之外,很难正确使用,因为您需要跟踪前景中的哪个窗口。我不知道为什么你需要它,但肯定你喜欢SetWindowsHookEx()或RegisterHotKey(),也许是System.Windows.Automation命名空间支持的UI自动化。