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

标签 delphi winapi keyboard-hook uipi

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

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

我已经尝试过:

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

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

最佳答案

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

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

要使其发挥作用,有一些注意事项

  • 应用程序必须经过authenticode签名
  • 应用程序必须驻留在 protected 目录 (\ProgramFiles\,\system32)

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

关于delphi - 如何从具有管理员权限的应用程序接收键盘输入到非管理员应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15898769/

相关文章:

c# - 在 C# 应用程序中接收操作系统级别的按键事件

delphi - 键盘 Hook 过程的问题

xml - Omni XML 可以反序列化包含对象列表的对象吗?

delphi - 有没有办法在 delphi 中禁用 TOpenDialog 的提示?

使用 cl.exe unicode 转换错误进行编译

c++ - 尝试从另一个进程读取 32 位整数时,ReadProcessMemory 使应用程序崩溃

c# - 我无法使用 C# 禁用 Windows 键

Delphi TClientDataSet,每个索引的最大字段数

delphi - 打印图像的实际尺寸

windows - 仅注入(inject)函数并通过 CreateRemoteThread 运行它? C++