C# uiAccess=true时,UAC进程上的Keyboard.IsKeyDown为false?

C# uiAccess=true时,UAC进程上的Keyboard.IsKeyDown为false?,c#,wpf,uac,C#,Wpf,Uac,我有一个程序试图在目标机器上安装自己,清单中有uiAccess=true 以下是关于这方面的文件: 根据文档,这应该授予应用程序在UAC提升的应用程序处于焦点时执行更多操作的权限 但是,只要管理应用程序处于焦点位置,Keyboard.IsKeyDown就会为任何实际上已关闭的键返回false 这让我相信,uiAccess这件事实际上没有起作用 以下是我确保正在发生的事情: 我的程序是用Comodo提供的文档中的代码签名证书签名的。它不是EV证书 程序从UAC保护路径(C:\program Fi

我有一个程序试图在目标机器上安装自己,清单中有
uiAccess=true

以下是关于这方面的文件:

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

但是,只要管理应用程序处于焦点位置,
Keyboard.IsKeyDown
就会为任何实际上已关闭的键返回
false

这让我相信,
uiAccess
这件事实际上没有起作用

以下是我确保正在发生的事情:

  • 我的程序是用Comodo提供的文档中的代码签名证书签名的。它不是EV证书
  • 程序从UAC保护路径(
    C:\program Files\Shapeshifter
    )启动
如何调试
uiAccess
并找出它不工作的原因?

如何调试uiAccess

唯一真正可以调试的是验证操作系统是否检测到您请求它。很容易做到,而且您可能已经做到了:不要对可执行文件签名。希望您现在不能再启动EXE。如果它真的启动了,那么您就知道UIPI并没有被禁用

Keyboard.IsKeyDown返回false

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

很难正确使用,超出Raymond的考虑,因为您需要跟踪哪个窗口位于前景。我不知道您为什么需要它,但您肯定会喜欢SetWindowsHookEx()或RegisterHotKey(),可能是System.Windows.Automation命名空间支持的UI自动化

如何调试uiAccess

唯一真正可以调试的是验证操作系统是否检测到您请求它。很容易做到,而且您可能已经做到了:不要对可执行文件签名。希望您现在不能再启动EXE。如果它真的启动了,那么您就知道UIPI并没有被禁用

Keyboard.IsKeyDown返回false

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


很难正确使用,超出Raymond的考虑,因为您需要跟踪哪个窗口位于前景。我不知道您为什么需要它,但您肯定会喜欢SetWindowsHookEx()或RegisterHotKey(),可能是System.Windows.Automation命名空间支持的UI自动化。

但在以下资源中,它表示uiaccess应用程序允许GetKeyState:当然,在调用AttachThreadInput之后。还提到。你试过了吗?然后你可以将代码复制/粘贴到你的问题中,其他人可以尝试重新处理问题。我尝试将UAC提升进程主窗口的UI线程附加到我的线程,但我仍然无法检测键盘状态。我需要先将自己的窗口推到前台吗?但是在下面的资源中,它表示允许uiaccess应用程序使用GetKeyState:当然,在调用AttachThreadInput之后。还提到。你试过了吗?然后你可以将代码复制/粘贴到你的问题中,其他人可以尝试重新处理问题。我尝试将UAC提升进程主窗口的UI线程附加到我的线程,但我仍然无法检测键盘状态。我需要先把自己的窗口推到前台吗?