Нажатие Win + X, Alt-Tab программно

Я пытаюсь смоделировать события нажатия клавиш для Win + X в Windows 8, когда должно появиться небольшое меню, но я не смог заставить это работать с помощью SendInput. Для любой другой комбинации клавиш (например, Win + R, Win + E, Win + D) это работает, но не для Win + X. Я заметил, что у Synergy + та же проблема, а у экранной клавиатуры Windows — нет. Я также посмотрел параметры SendInput, которые использует экранная клавиатура, но если я использую в приложении те же параметры, что и у меня, меню все равно не появится.

Итак, мой вопрос, как мне заставить это работать? Или есть альтернативный способ отображения этого меню?

6

Решение

Я недавно добавил поддержку этого в наше приложение. Рад, что мы победили нашего конкурента!

В 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 буду работать.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]