Чому візуальна студія фіксує ключові події перед autohotkey?


82

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

Замість того , щоб переучуватися все гарячі клавіші, я написав сценарій AutoHotkey , щоб перевести Дворжак макет назад QWERTY , коли Ctrl, Alt, або Winнатискання клавіш у поєднанні з іншими клавішами. Це чудово працює скрізь, де я пробував, крім Visual Studio '08. Здається, натискання на клавіші вловлюються до того, як їх автоматично перекладе кнопка.

Чому це відбувається і як це виправити?

Нижче наведено уривок (з самого початку) мого сценарію:

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

Оновлення: Сценарій чудово працює на Win7 з нещодавно встановленими ahk, vs08 та coderush. На машині, з якою у мене проблеми, працює Vista. Будь-які думки про те, як додатково діагностувати?

Оновлення 2: Сценарій чудово працює з Vista та 2010 бета-версія 2. Здається, це щось із лише проти 08 + vista. Спробую сьогодні ввечері встановити vs08.

Відповіді:


176

Ага! Я це зрозумів. Якщо ahk і цільова програма не працюють за однаковими привілеями (або користувачем), ahk не буде належним чином перехоплювати / моделювати події клавіатури. У моєму випадку Visual Studio запускався з правами адміністратора (з підвищеними правами), тоді як скрипт 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

Просто хочу додати пару пунктів до рішення, яке знайшов сам OP.

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

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


3

Це пов’язано з функцією безпеки, яка називається Ізоляція привілеїв користувальницького інтерфейсу (UIPI) , яка є частиною контролю облікових записів користувачів (UAC).

У поширених запитаннях перелічено декілька обхідних шляхів:

Як мені вирішити проблеми, викликані контролем облікових записів користувачів (UAC)?

Загальні обхідні шляхи такі:

  • Увімкніть параметр «Виконати з доступом до інтерфейсу користувача» до контекстного меню в налаштуваннях AutoHotkey. Цю опцію можна ввімкнути або вимкнути без перевстановлення AutoHotkey, повторно запустивши програму AutoHotkey Setup із меню «Пуск». Після того, як його ввімкнено, запустіть файл сценарію, клацнувши його правою кнопкою миші та вибравши пункт Запустити з доступом до інтерфейсу користувача , або скористайтеся командним рядком типу "AutoHotkeyU32_UIA.exe" "Your script.ahk"(але включайте повні шляхи).
  • Запустіть скрипт від імені адміністратора. Зверніть увагу, що це також призводить до того, що будь-які програми, запущені сценарієм, працюють від імені адміністратора, і може вимагати від користувача прийняти запит на затвердження під час запуску сценарію.
  • Вимкніть локальну політику безпеки "Запустити всіх адміністраторів у режимі схвалення адміністратора" (не рекомендується).
  • Повністю вимкніть UAC. Це не рекомендується, і це неможливо в ОС Windows 8 або новішої версії.

Як правило, я не рекомендую запускати сценарій як адміністратор для вирішення цієї проблеми, оскільки він має побічні ефекти, які можуть бути несподіваними або небажаними. Наприклад, будь-яка програма, з якою запускається сценарій Run, також буде працювати як адміністратор. Сценарій також матиме зайвий дозвіл на запис у різні папки, такі як програмні файли. Трохи поганого коду (шкідливий код, скопійований звідкись, або код із помилкою) може нанести більшої шкоди таким чином.

Звичайно, останні два варіанти теж не рекомендую. Це залишає лише Запуск із доступом до інтерфейсу , який можна ввімкнути та використовувати, як описано вище.


0

Мабуть, для цього є обхідний шлях.

З документації Program.htm # Installer_uiAccess .
Тема форуму від Lexikos

Витяг:

EnableUIAccess

Змінює AutoHotkey.exe, щоб дозволити сценаріям робити наступне, навіть якщо UAC увімкнено:

Взаємодійте з вікнами адміністративних програм, не запускаючи сценарій від імені адміністратора. Використовуйте SendPlay. Є обмеження; будь ласка, прочитайте пост перед використанням цього сценарію.

Посилання для завантаження на файл ahk не працює на форумі, але я знайшов його на Github: EnableUIAccess.ahk


Чому ви дивитесь на EnableUIAccess.ahk? Він застарів. Документація, до якої ви зв’язали, розповідає про опцію, вбудовану в інсталятор AutoHotkey. Інсталятор містить усе необхідне. (Я також опублікував більше деталей як відповідь.)
Лексікос,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.