Keyboard.IsKeyDown 使用 uiAccess=true 的 UAC 进程为 false?

Keyboard.IsKeyDown false over UAC process with uiAccess=true?

我有一个程序试图将自己安装到清单中带有 uiAccess=true 的目标机器上。

这是相关文档:https://msdn.microsoft.com/en-us/library/windows/desktop/ee671610(v=vs.85).aspx

根据文档,当 UAC 提升的应用程序处于焦点时,这应该授予应用程序执行更多操作的权限。

但是,一旦管理应用程序成为焦点,Keyboard.IsKeyDown returns false 任何实际按下的键。

这让我相信 uiAccess 东西实际上没有用。

这是我确定正在发生的事情:

如何调试 uiAccess 并弄清楚为什么它不工作?

How can I debug uiAccess

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

Keyboard.IsKeyDown returns false

这是预期的行为,禁用 UIPI 无法解决问题。此 WPF 属性 在后台使用 GetKeyState()。 SO 的一个相当臭名昭著的功能有很多受害者和很少的可用答案。键盘状态和输入处理是每个进程(技术上是每个输入队列),只有在前台有 window 的进程才能看到按键。解决这个问题需要使用 Raymond Chen 讨厌的 winapi 函数 AttachThreadInput()。期望在 UIPI 禁用后它不再因错误 5 而失败(又名访问被拒绝)。

很难正确使用,这超出了 Raymond 的顾虑,因为您需要跟踪哪个 window 在前台。我不知道你为什么需要它,但你肯定会喜欢 SetWindowsHookEx() 或 RegisterHotKey(),也许 UI System.Windows.Automation 命名空间支持的自动化。