如何从具有管理员权限的应用程序接收键盘输入到非管理员应用程序?

时间:2013-04-09 09:51:28

标签: delphi winapi keyboard-hook uipi

我编写了一个具有覆盖类型窗口的应用程序,可以通过热键显示和隐藏,而另一个应用程序具有焦点。所述其他应用程序是使用管理员权限运行的DirectX游戏。

我已经尝试了3种可能的解决方案,当我在其他应用程序中按下热键时收到通知,其中2种工作,但要求我的应用程序也具有管理权限。这是可以接受的,但我宁愿有一个不需要这些特权的解决方案。我确信必须有一种方法,因为像TeamSpeak这样的应用程序确实能够在不以管理员身份运行的情况下接收输入。

我已经尝试过了:

  1. RegisterHotkey - 不合适,因为它在DirectX窗口中不起作用。
  2. SetWindowsHookEx - 作为一般键盘挂钩,但仅限管理员权限。
  3. GetAsyncKeyState - 用于检查指定的热键,但不能再次使用管理员权限。
  4. 所以是的,如果有人可以为不同的解决方案提供一个想法,我真的很感激,因为我无法想到......我正在使用Delphi,但是因为我依赖Windows API反正我不要认为解决方案会特定于语言。

1 个答案:

答案 0 :(得分:4)

我认为TeamSpeak使用DirectInput作为其热键(如果您已经在使用DirectX,那么非常适合您)。至于与提升程序的交互,我认为唯一的解决方案,我相信TeamSpeak使用的解决方案是嵌入一个设置uiAccess=true的应用程序清单。这允许您绕过UIPI而无需以管理员身份运行应用程序。

http://msdn.microsoft.com/en-us/library/bb756929.aspx

为了实现这一点,有一些注意事项

  • 应用程序必须是authenticode签名
  • 应用程序必须位于受保护的目录(\ ProgramFiles \,\ system32)

您可以对应用程序进行自签名(因为替代方案很昂贵!)但您必须手动分发证书并将其安装在运行相关应用程序的任何系统上。