Почему визуальная студия захватывает ключевые события перед autohotkey?

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

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

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

Ниже приведен фрагмент (с самого начала) моего script:

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

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

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

Ответ 1

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

Либо одно из следующего разрешило проблему:

  • Запуск обоих vs и ahk в качестве текущего пользователя
  • Компиляция script и запуск обоих vs и скомпилированного приложения в качестве администратора

Ответ 2

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

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

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

Ответ 3

Эта фраза в маленькая печать звучит актуально:

Если SendMode используется в секции автоматического выполнения (верхняя часть script), это влияет на все повторные сопоставления. Однако, поскольку переназначение использует Send {Blind}, и поскольку режим SendPlay не полностью поддерживает {Blind}, некоторые переназначения могут работать неправильно в режиме SendPlay (, особенно Control, Shift, Alt и Win). Чтобы обойти это, избегайте SendPlay в разделе автозапуска при перенаправлении; затем используйте команду SendPlay против Send в других местах на протяжении script. Кроме того, вы можете перевести свои перепечатки в горячие клавиши (как описано ниже), которые явно вызывают SendEvent vs. Send.