Как получить ввод с клавиатуры из приложения с правами администратора для приложения без администратора?
Я запрограммировал приложение, которое имеет оверлейный вид окна, которое может быть показано и скрыто с помощью горячей клавиши, в то время как другое приложение имеет фокус. Упомянутое другое приложение - это игра DirectX, которая работает с правами администратора.
Я уже пробовал 3 возможных решения для получения уведомления, когда моя горячая клавиша нажата в другом приложении, 2 из них - вид работы, но для моего приложения также требуются административные привилегии. Это приемлемо, но я бы предпочел иметь решение, которое не требует этих привилегий. Я уверен, что должен быть какой-то способ, так как приложениям, таким как TeamSpeak, удается получать ввод без запуска как admin.
Я уже пробовал:
- RegisterHotkey - не подходит, потому что он не работает в окнах DirectX.
- SetWindowsHookEx - работает как общий крючок клавиатуры, но только с правами администратора.
- GetAsyncKeyState - работает, чтобы проверить указанную горячую клавишу, но не без дополнительных прав администратора.
Итак, я был бы очень благодарен, если бы кто-то мог представить идею для другого решения, потому что я ничего не могу придумать... Я использую Delphi, но так как я полагаюсь на Windows API в любом случае не думайте, что решение будет специфичным для языка.
Ответы
Ответ 1
Я думаю, что TeamSpeak использует DirectInput для своих горячих клавиш (подходит вам, если вы уже используете DirectX). Что касается взаимодействия с повышенными программами, я думаю, что единственное решение, и я считаю, что один из них использует TeamSpeak, заключается в том, чтобы внедрить манифест приложения, который устанавливает uiAccess=true
. Это позволяет обойти UIPI без необходимости запуска приложения в качестве администратора.
http://msdn.microsoft.com/en-us/library/bb756929.aspx
Для этого есть несколько предостережений
- Приложение должно быть подписано с помощью аутентификации
- Приложение должно находиться в защищенном каталоге (\ ProgramFiles \,\system32)
Вы можете самостоятельно подписывать приложение (в качестве альтернативы дорого!), но вы должны распространять сертификат вручную и устанавливать его в любой системе, на которой выполняется указанное приложение.