Почему Visual Studio улавливает ключевые события до autohotkey?

82

Недавно я в качестве эксперимента переключился на раскладку клавиатуры Дворжака. Одна из самых сложных частей перехода связана с горячими клавишами. Большинство горячих клавиш разработаны с учетом QWERTY, и, что еще хуже, горячие клавиши кажутся чрезвычайно ограниченными мышечной памятью.

Вместо того, чтобы заново изучать все горячие клавиши, я написал сценарий autohotkey для перевода макета Дворака обратно в QWERTY, когда Ctrl,Alt , или Winнажатие клавиш в сочетании с другими клавишами. Он прекрасно работает везде, где я пробовал, кроме Visual Studio '08. Кажется, нажатия клавиш перехватываются до того, как autohotkey сможет их перевести.

Почему это происходит и как это исправить?

Ниже приводится отрывок (с самого начала) моего сценария:

; control + letter
^;::^z
^q::^x
^j::^c
^k::^v

Обновление: скрипт отлично работает на Win7 с недавно установленными ahk, vs08 и coderush. На машине, с которой у меня проблемы, работает Vista. Есть мысли, как дальше ставить диагноз?

Обновление 2: сценарий отлично работает с Vista и 2010 beta 2. Кажется, что-то вроде vs 08 + vista. Сегодня вечером попробую новую установку vs08.

Дэйн О'Коннор
источник

Ответы:

176

Ага! Я понял это. Если ahk и целевое приложение не работают с одинаковыми привилегиями (или пользователями), ahk не будет правильно перехватывать / моделировать события клавиатуры. В моем случае визуальная студия запускалась с правами администратора (повышенными), в то время как сценарий ahk запускался от имени текущего пользователя, вошедшего в систему.

Любой из следующих способов решил проблему:

  • Запуск vs и ahk от имени текущего пользователя
  • Компиляция скрипта и запуск как vs, так и скомпилированного приложения от имени администратора
Дэйн О'Коннор
источник
15
Просто хотел добавить, что дело не в разных разрешениях. Но вместо этого тот факт, что сценарий AutoHotkey не будет работать с приложением, которое работает с более высоким уровнем привилегий, чем сценарий. Смотрите мой ответ ниже.
Himanshu P
2
Вы можете добавить «Запуск от имени администратора» в контекстное меню для ahk. Это экономит этап компиляции. howtogeek.com/howto/windows-vista/…
Адам Белл,
Я нашел здесь более чистый способ запускать скрипт AutoHotkey от имени администратора при каждом запуске без вмешательства пользователя с помощью планировщика задач: autohotkey.com/boards/viewtopic.php?t=21434
Хосе Антонио
Приветствую
illusion466
48

Просто хочу добавить пару пунктов к решению, найденному самим ОП.

1) Проблема не в том, что AHK и VS работают с разными разрешениями - просто горячие клавиши, созданные скриптом, запущенным в режиме без администратора , не будут работать с приложениями, запущенными в админке. режиме , но не было бы проблем, если бы они наоборот.

2) Нет необходимости обязательно компилировать сценарий, просто установите autohotkey.exe для запуска в режиме администратора (это то, что я делаю) или, в качестве альтернативы, создайте ярлык для конкретного сценария и установите его всегда для запуска в режиме администратора. (кстати, просто чтобы указать, нет увеличения производительности при запуске скомпилированной версии сценария AHK, потому что код все еще интерпретируется - просто теперь интерпретатор встроен в созданный исполняемый файл)

Химаншу П
источник
3

Это связано с функцией безопасности, которая называется изоляцией привилегий пользовательского интерфейса (UIPI) , которая является частью контроля учетных записей пользователей (UAC).

В FAQ есть несколько обходных путей:

Как обойти проблемы, вызванные контролем учетных записей пользователей (UAC)?

Общие обходные пути заключаются в следующем:

  • Включите параметр Добавить «Запуск с доступом к пользовательскому интерфейсу» в контекстное меню в настройке AutoHotkey. Этот параметр можно включить или отключить, не переустанавливая AutoHotkey, повторно запустив программу установки AutoHotkey из меню «Пуск». Как только он будет включен, запустите файл сценария, щелкнув его правой кнопкой мыши и выбрав « Выполнить с пользовательским интерфейсом» , или используйте командную строку, например "AutoHotkeyU32_UIA.exe" "Your script.ahk"(но включите полные пути).
  • Запускаем скрипт от имени администратора. Обратите внимание, что это также приводит к тому, что любые программы, запускаемые сценарием, запускаются от имени администратора, и может потребовать, чтобы пользователь принял приглашение на утверждение при запуске сценария.
  • Отключите локальную политику безопасности «Запускать всех администраторов в режиме утверждения администратором» (не рекомендуется).
  • Полностью отключите UAC. Это не рекомендуется и невозможно в Windows 8 или более поздних версиях.

Обычно я не рекомендую запускать сценарий от имени администратора, чтобы обойти эту проблему, поскольку он имеет побочные эффекты, которые могут быть неожиданными или нежелательными. Например, любая программа, запускаемая скриптом сRun , также будет запускаться от имени администратора. У сценария также будет ненужное разрешение на запись в различные папки, такие как Program Files. Немного плохого кода (вредоносный код, скопированный откуда-то или код с ошибкой) может таким образом нанести больший ущерб.

Последние два варианта, конечно, тоже не рекомендую. Остается только Запуск с доступом к пользовательскому интерфейсу , который можно включить и использовать, как описано выше.

Лексикос
источник
0

По-видимому, для этого есть обходной путь.

Из документов Program.htm # Installer_uiAccess .
Тема форума от Lexikos

Отрывок:

EnableUIAccess

Изменяет AutoHotkey.exe, чтобы разрешить сценариям выполнять следующие действия даже при включенном UAC:

Взаимодействовать с окнами административных программ без запуска скрипта от имени администратора. Используйте SendPlay. Есть ограничения; пожалуйста, прочтите сообщение перед использованием этого скрипта.

Ссылка для загрузки файла ahk на форуме не работает, но я нашел ее на Github: EnableUIAccess.ahk

Лауджин
источник
Почему вы смотрите на EnableUIAccess.ahk? Это устарело. В документации, на которую вы ссылаетесь, рассказывается о опции, встроенной в установщик AutoHotkey. Установщик содержит все необходимое. (Я также опубликовал более подробную информацию в качестве ответа.)
Lexikos