Я пытаюсь смоделировать события нажатия клавиш для Win + X в Windows 8, когда должно появиться небольшое меню, но я не смог заставить это работать с помощью SendInput. Для любой другой комбинации клавиш (например, Win + R, Win + E, Win + D) это работает, но не для Win + X. Я заметил, что у Synergy + та же проблема, а у экранной клавиатуры Windows — нет. Я также посмотрел параметры SendInput, которые использует экранная клавиатура, но если я использую в приложении те же параметры, что и у меня, меню все равно не появится.
Итак, мой вопрос, как мне заставить это работать? Или есть альтернативный способ отображения этого меню?
Я недавно добавил поддержку этого в наше приложение. Рад, что мы победили нашего конкурента!
В Windows 8 введены новые ограничения UIPI. Наиболее часто используемые заблокированные ярлыки Alt+табуляция, так что вы захотите сделать обходной путь.
Вы должны отметить свои двоичные файлы uiAccess="true"
в манифесте. (Подробнее о том, как это сделать, см. В Google.) Этот манифест не позволяет запускать двоичные файлы, если они не подписаны сертификатом для подписи кода, одобренным Microsoft, и не установлены в «безопасном месте» (system32 или Program Files / Program Files (x86)). ,
Если вы запускаете программу из каких-либо помощников: бинарный файл uiAccess не может быть запущен с CreateProcess
из процесса средней целостности (манифест помечает его как требующий «высокой» целостности). Вместо этого проще всего запустить его, используя ShellExecute
«открыть», чтобы получить оболочку, чтобы поднять его. При использовании CreateProcessAsUser
, вы должны установить TokenUIAccess
до 1 с помощью SetTokenInformation
или запуск не удастся.
Заключительные условия: обратите внимание, что uiAccess довольно сильно ограничивает возможности процесса. Вы не можете получать входные данные пользовательского интерфейса от обычных процессов (средней целостности), поэтому другие приложения не могут взаимодействовать с вашими окнами. Если вы еще не придерживаетесь хороших практик разделения вашего пользовательского интерфейса на отдельный процесс, это будет хорошей причиной для этого. В качестве альтернативы, задачи, требующие uiAccess, могут быть помещены в небольшой автономный вспомогательный двоичный файл и также полностью отделены от процесса без пользовательского интерфейса. Ваше основное приложение может запускать его как вспомогательный процесс с высокой степенью целостности, которому отправляются инструкции, необходимые для выполнения этих конкретных задач (таких как SendInput
).
В заключение, SendInput
буду работать.
Других решений пока нет …