Если вам нужны конкретные инструкции по переназначению клавиш стандартными методами и код программы для прослушки нажатия клавиш, то все это лежит в разделе инструкций.
Немного предистории
Год назад я купил Mac с функциональными клавишами и столкнулся с кнопкой dictation
, которая вызывает стандартную программу для диктовки текста. Перед покупкой я предположил что это кнопка с значком микрофона должна включать и выключать микрофон, каково же было мое разочарование, когда вместо функционала включения и выключения микрофона я получил запуск dictation
. Меня это не устроило и я начал поиски.
Первой программой, которую я нагулил, была Karabiner-Elements. Но она показалась мне слишком громоздкой для такой небольшой задачи.
Далее я нашел Ukelele, которая позволяет создать свою раскладку клавиатуру. Уже лучше, более нативно, но это все еще не то что нужно.
Потом я наткнулся на статью. В ней довольно подробно описывается как переназначить клавиши через утилиту hidutil
встроенную в MacOS.
Тут появилась идея переназначить клавишу dictation
на клавишу, которая не используется на клавиатуре, но поддерживается системой. Т.е. переназначить код, который отправляет эта клавиша в систему. Я это сделал через hidutil
, плюс написал небольшую программу, которая слушает события с клавиатуры и запускает скрипт по нажатию на клавишу F18.
В принципе можно сделать через обычный скрипт Apple, который запускается на шорткат, но хотелось бы видеть состояние микрофона в StatusBar.
Инструкции по настройке
Получение кода клавиши dictation
Перед тем как переназначить клавиши нам нужно получить код клавиши dictation
. Для этого нужно вызвать в терминале команду:
ioreg -l|grep FnFunctionUsageMap|grep -Eo "0x[0-9a-fA-F]+,0x[0-9a-fA-F]+"
Эта команда фильтрует вывод
ioreg
через утилитуgrep
, так что если вдруг у вас не будет работать эта команда, вы можете сохранить вывод командыioreg -l
в текстовый документ и найти определение переменнойFnFunctionUsageMap
.
Вернемся к команде. Вывод должен быть примерно таким:
Это и есть коды функциональных и медиа клавиш. В левом столбике идут коды функциональных клавиш (F1, F2, F3 и т.д.), в правом медиа клавиш.
Нам нужна медиа клавиша, которая на кнопке F5. Это будет пятый код сверху в правом столбике:
Далее нужно перевести этот код из 32 битного числа в 64 битный. Для этого нужно заполнить число незначащими нулями 0x000c00cf
-> 0x000c000000cf
.
Отлично. Теперь мы можем переназначить эту клавишу.
Мапинг через hidutil
Чтобы смапить клавишу dictation
на F18 нужно вызвать команду в терминале:
hidutil property --set '{"UserKeyMapping": [{"HIDKeyboardModifierMappingSrc":0x000c000000cf,"HIDKeyboardModifierMappingDst":0x70000006D}]}'
Более подробно о том как работает
hidutil
можно найти в Tech Note от Apple.
Плюс нам нужно добавить запуск этого скрипта при запуске системы. Для этого нужно создать файл ~/Library/LaunchAgents/com.nanoant.KeyRemapping.plist
с таким содержанием:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.nanoant.KeyRemapping</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/hidutil</string>
<string>property</string>
<string>--set</string>
<string>{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x000C000000CF,"HIDKeyboardModifierMappingDst": 0x70000006D}]}</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Теперь при нажатии на клавишу dictation
должна срабатывать клавиша F18.
Программа для отключения микрофона
Принцип работы программы в том, что она слушает события с клавиатуры и хранит состояние микрофона. При первом запуске, она сбрасывает состояние микрофона в включенное состояние. Далее, когда происходит событие, она запускает AppleScript, изменяет переменную состояния и иконку в StatusBar.
Для того чтобы слушать события с клавиатуры приложению нужны права Accessibility и Input Monitoring. Они проставляются в настройках.
Собранное приложение можно найти в релизах в Гитхабе, либо собрать самостоятельно из исходного кода.
При первом запуске приложение запросит права. Далее его нужно рестартануть. Для этого вызываем в терминале:
killall Microphone
и снова запускаем приложение.
Обратите внимание на то, что если вы собираете приложение через XCode и запускаете сборку, то вам нужно будет дать права на Accessibility и Input Monitoring XCode тоже. Также при каждой новой сборке вам нужно будет удалять права в настройках и после запуска приложения добавлять их снова.
Полезные ссылки
Комментарии (6)
LeshaRB
10.01.2024 06:05А если я в наушниках звук отключиться?
Чтоб на автомате на работе не нажать, а по факту звук останетсяmkleputin Автор
10.01.2024 06:05Не учитывал такой кейс. Вообще скрипт срабатывает для активного источника ввода. Т.е. если изначально микрофон был включен, мы подрубили наушники и нажали клавишу, то сработает (если наушники стали активным источником ввода). Но есть проблема с тем как оно работает, когда в приложении выбран источник ввода, отличный от того который выбран в настройках системы
ris58h
10.01.2024 06:05+2В полезные ссылки стоит добавить https://hidutil-generator.netlify.app/
Upd: у меня статья тут была на эту тему.
sneg2015
10.01.2024 06:05Немного не в тему, но этой функцией удобно большой текст надиктовывать, когда писать его лень.
bolk
У меня иконка приложения не меняет своё состояние при переключении режима микрофона. Права дал, macOS 14.2.1 (23C71).
mkleputin Автор
Забыл дописать. После первого запуска нужно рестартануть утилиту. Для этого в терминале нужно вызвать:
Далее стартануть программу