2013-04-09 4 views
11

Я запрограммировал приложение, которое имеет оверлейное окно, которое может быть показано и скрыто с помощью горячей клавиши, в то время как другое приложение имеет фокус. Упомянутое другое приложение - это игра DirectX, работающая с правами администратора.Как получить ввод с клавиатуры из приложения с правами администратора для приложения без администратора?

Я уже пробовал 3 возможных решения, чтобы получить уведомление, когда моя горячая клавиша нажата в другом приложении, 2 из них - вид работы, но для моего приложения также требуются административные привилегии. Это приемлемо, но я бы предпочел иметь решение, которое не требует этих привилегий. Я уверен, что должен быть какой-то способ, так как приложениям, таким как TeamSpeak, удается получать входные данные без запуска как admin.

То, что я уже пробовал:

  1. RegisterHotkey - не подходит, потому что он не работает в то время как в DirectX окна.
  2. SetWindowsHookEx - работает как обычный клавиатурный крючок, но только с правами администратора.
  3. GetAsyncKeyState - работает, чтобы проверить указанную горячую клавишу, но не без дополнительных прав администратора еще раз.

Итак, я был бы очень благодарен, если бы кто-то мог представить идею для другого решения, поскольку я ничего не могу придумать ... Я использую Delphi, но поскольку я полагаюсь на Windows API в любом случае я не думаю, что решение будет специфичным для языка.

ответ

4

Я думаю, что TeamSpeak использует DirectInput для своих горячих клавиш (подходит вам, если вы уже используете DirectX). Что касается взаимодействия с повышенными программами, я думаю, что единственное решение, и я считаю, что один из них использует TeamSpeak, заключается в том, чтобы внедрить манифест приложения, который устанавливает uiAccess=true. Это позволяет обойти UIPI без необходимости запуска приложения в качестве администратора.

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

Для этой работы есть несколько предостережений

  • Заявление должно быть Authenticode подписан
  • Заявление должно находиться в защищенном каталоге (\ ProgramFiles \, \ system32)

Вы можете самостоятельно подписать заявку (в качестве альтернативы дорого!), Но вы должны распространять сертификат вручную и установить его на любую систему, в которой работает указанное приложение.

+1

Спасибо за ваш вклад, кажется, это правильное решение. Однако из того, что я прочитал, предоставление такого самозаверяющего сертификата вместе с моим установщиком представляет собой потенциальный риск для безопасности, который я бы предпочел не принимать, поскольку у меня нет более глубокого понимания этого вопроса ... исправьте меня, Неправильно. – DNR

+0

@HeinaBaumstamm Я полагаю, что для пользователя безопаснее запускать приложение с помощью uiAccess по полной прав администратора ... в любом случае вы должны доверять им, что вы не навязываете им вредоносное ПО. В противном случае вероятность того, что ваше приложение станет точкой входа для внешних эксплойтов, будет минимальным. Разумеется, ваше приложение будет более ограниченным в случае случайного повреждения, которое может быть вызвано ошибками, если вы используете uiAccess поверх прямого администратора. Это действительно вопрос удобства и доверия ... зависит от того, кто будет использовать программу, действительно. –