11

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

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

我已经尝试过的:

  1. RegisterHotkey - 不适合,因为它在 DirectX 窗口中不起作用。
  2. SetWindowsHookEx - 用作通用键盘挂钩,但仅具有管理员权限。
  3. GetAsyncKeyState - 用于检查指定的热键,但不是没有管理员权限。

所以是的,如果有人能提供一个不同的解决方案的想法,我将非常感激,因为我想不出更多了......我正在使用 Delphi,但因为我依赖于 Windows API,所以我不认为解决方案将是特定于语言的。

4

1 回答 1

4

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

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

为此,有一些注意事项

  • 应用程序必须经过验证码签名
  • 应用程序必须位于受保护的目录 (\ProgramFiles\,\system32)

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

于 2013-04-09T11:23:49.797 回答