Если вам нужны конкретные инструкции по переназначению клавиш стандартными методами и код программы для прослушки нажатия клавиш, то все это лежит в разделе инструкций.

Немного предистории

Год назад я купил 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>{&quot;UserKeyMapping&quot;:[{&quot;HIDKeyboardModifierMappingSrc&quot;:0x000C000000CF,&quot;HIDKeyboardModifierMappingDst&quot;: 0x70000006D}]}</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
</dict>
</plist>

Теперь при нажатии на клавишу dictation должна срабатывать клавиша F18.

Программа для отключения микрофона

Ссылка на программу.

Принцип работы программы в том, что она слушает события с клавиатуры и хранит состояние микрофона. При первом запуске, она сбрасывает состояние микрофона в включенное состояние. Далее, когда происходит событие, она запускает AppleScript, изменяет переменную состояния и иконку в StatusBar.

Для того чтобы слушать события с клавиатуры приложению нужны права Accessibility и Input Monitoring. Они проставляются в настройках.

Собранное приложение можно найти в релизах в Гитхабе, либо собрать самостоятельно из исходного кода.

При первом запуске приложение запросит права. Далее его нужно рестартануть. Для этого вызываем в терминале:

killall Microphone

и снова запускаем приложение.

Обратите внимание на то, что если вы собираете приложение через XCode и запускаете сборку, то вам нужно будет дать права на Accessibility и Input Monitoring XCode тоже. Также при каждой новой сборке вам нужно будет удалять права в настройках и после запуска приложения добавлять их снова.

Полезные ссылки

Комментарии (6)


  1. bolk
    10.01.2024 06:05

    У меня иконка приложения не меняет своё состояние при переключении режима микрофона. Права дал, macOS 14.2.1 (23C71).


    1. mkleputin Автор
      10.01.2024 06:05

      Забыл дописать. После первого запуска нужно рестартануть утилиту. Для этого в терминале нужно вызвать:

      killall Microphone

      Далее стартануть программу


  1. LeshaRB
    10.01.2024 06:05

    А если я в наушниках звук отключиться?
    Чтоб на автомате на работе не нажать, а по факту звук останется


    1. mkleputin Автор
      10.01.2024 06:05

      Не учитывал такой кейс. Вообще скрипт срабатывает для активного источника ввода. Т.е. если изначально микрофон был включен, мы подрубили наушники и нажали клавишу, то сработает (если наушники стали активным источником ввода). Но есть проблема с тем как оно работает, когда в приложении выбран источник ввода, отличный от того который выбран в настройках системы


  1. ris58h
    10.01.2024 06:05
    +2

    В полезные ссылки стоит добавить https://hidutil-generator.netlify.app/

    Upd: у меня статья тут была на эту тему.


  1. sneg2015
    10.01.2024 06:05

    Немного не в тему, но этой функцией удобно большой текст надиктовывать, когда писать его лень.