Как лучше исправить AHK-скрипт?
По вводным: windows-10, первый опыт использования AHK. По мотивам своей возни с Linux попытался навесить включение русской раскладки на правый Ctrl, а латинской на левый. Получился вот такой простейший скрипт:
~LCtrl up:: If (A_PriorKey = "LControl") { SendMessage, 0x50,, 0x4090409,, A ; английский } ~RCtrl up:: If (A_PriorKey = "RControl") { SendMessage, 0x50,, 0x4190419,, A ; русский }
Сейчас ситуация такая: он прекрасно работает в обычных окнах, но категорически отказывается срабатывать в служебных окнах Windows: например, в стандартном окне сохранения файла.
Нужно понять: в чём состоит ошибка и как её исправить?
Сейчас ситуация такая: p.S. То, что PuntoSwitcher решает задачу, я знаю. Но связываться с этой программой не имею ни малейшего желания.
По вводным: p.P.S. Смысл именно в том, чтобы оставить в системе единственный способ переключения языков - без навешивания дополнительных комбинаций клавиш в системных настройках и эмуляции их нажатия.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В AutoHotkey проблема у такого скрипта обычно в двух вещах: синтаксис старой версии AHK v1 и то, что
SendMessageотправляется в активное окно, но не все приложения принимают смену раскладки одинаково. Особенно это заметно в окнах с повышенными правами, UWP-приложениях, играх и некоторых терминалах.Для AHK v1 ваш вариант лучше оформить с блоками и
return:~LCtrl up:: if (A_PriorKey = "LControl") { PostMessage, 0x50, 0, 0x4090409,, A } return ~RCtrl up:: if (A_PriorKey = "RControl") { PostMessage, 0x50, 0, 0x4190419,, A } return~LCtrl up:: if (A_PriorKey = "LControl") { PostMessage, 0x50, 0, 0x4090409,, A } return ~RCtrl up:: if (A_PriorKey = "RControl") { PostMessage, 0x50, 0, 0x4190419,, A } return
Я бы использовал
PostMessage, чтобы не ждать ответа от окна. Если нужно надёжнее, можно переключать через горячие клавиши Windows, но тогда надо настроить их в системе.Если не работает в приложениях, запущенных от администратора, сам AHK-скрипт тоже должен быть запущен от администратора. Windows не даёт обычному процессу нормально управлять elevated-окном.
Ещё момент:
A_PriorKeyможет вести себя не так, если Ctrl используется в сочетаниях. Условие “только одиночное нажатие Ctrl” правильное, но его надо тестировать в нужных приложениях.Для AHK v2 синтаксис будет другим, v1-скрипт там не заработает без изменений. Проверьте версию AutoHotkey.
Итог: добавьте
return, используйте корректный синтаксис под вашу версию AHK, попробуйтеPostMessage, а для админских окон запускайте скрипт с такими же правами. Если конкретное приложение игнорирует смену раскладки, это ограничение самого окна, а не только скрипта.