Во-первых, диктант FnFn является функцией NSText
(или, может быть, NSTextView
?) Какао-контроль. Если у вас есть один из них, продиктованный текст вставляется в этот элемент управления. (Он также использует существующий текст этого элемента для контекста.) С точки зрения приложения с использованием NSTextView
, если вы просто создаете стандартное меню «Правка», элемент «Начало диктовки» добавляется в конец, а FnFn - как ярлык, и все, что продиктовано, появляется как входной сигнал, так же как ввод, введенный на клавиатуре, или вставляемый или перемещаемый с помощью мыши, или с помощью любого другого метода ввода.
Итак, если у вас нет приложения с графическим интерфейсом, включение диктовки будет бессмысленным, потому что у вас нет способа получить вход.
Если у вас есть приложение с графическим интерфейсом, простейшая вещь - просто получить пункт меню через NSMenu
и нажать на элемент.
Вы почти наверняка используете какую-то графическую библиотеку, такую как PyQt или Tkinter, которая имеет свой собственный способ доступа к меню вашего приложения. Но если нет, то вы можете сделать это прямо через какао (используя PyObjC-который поставляется с Apple, предустановленным Python, но вы должны будете pip install
, если вы используете сторонний Python):
import AppKit
mb = AppKit.NSApp.mainMenu()
edit = mb.itemWithTitle_('Edit').submenu()
sd = edit.indexOfItemWithTitle_('Start Dictation')
edit.performActionForItemAtIndex_(sd)
Но если вы пишете консольную программу, которая работает в терминале (будь то Terminal.app или альтернатива, такая как iTerm), приложение, в котором вы работаете, имеет свой собственный текстовый виджет и меню Edit, и вы можете паразитно вместо этого используйте его меню.
Проблема в том, что у вас нет разрешения просто управлять другими приложениями, если пользователь не разрешает это делать.В более ранних версиях OS X это было сделано только путем включения «вспомогательных скриптов для доступности» в глобальном масштабе. Начиная с 10.10 на вкладке «Безопасность» на вкладке «Конфиденциальность» на панели «Безопасность» & «Системные настройки» есть список приложений, имеющих разрешения. К счастью, если вы не в списке, при первом использовании функций доступности появится диалоговое окно, и если пользователь нажмет на него, он запустит Системные настройки, покажет этот якорь, добавит ваш приложение к списку с отключенным флажком и прокрутите его в представлении, поэтому все, что нужно сделать пользователю, - это установить флажок.
AppleScript, чтобы сделать это:
tell application "System Events"
click (menu item "Start Dictation" of menu of menu bar item "Edit"
of menu bar of (first process whose frontmost is true))
end tell
«Право» способ сделать эквивалент в Питоне через ScriptingBridge
, который вы можете получить доступ через PyObjC ... но это намного проще в использовании третьего партия библиотека appscript
:
from appscript import app, its
se = app('System Events')
proc = app.processes[its.frontmost == True]
mi = proc.menu_bars[1].menu_bar_items['Edit'].menus[1].menu_items['Start Dictation']
mi.click()
Если вы действительно хотите, чтобы передать ключ Fn в два раза, что API-интерфейсы для создания и отправки событий клавиатур являются частью Quartz Events Services, который (хотя это API-интерфейс CoreFoundation C, а не API-интерфейс Cocoa ObjC) также обернут PyObjC. Документация может быть немного сложной для понимания, но в основном идея состоит в том, что вы создаете событие соответствующего типа, а затем отправляете его в конкретное приложение, ответ на событие или местоположение крана. Таким образом, вы можете создать и отправить общесистемного ключ вниз Fn-ключевое событие, как это:
evt = Quartz.CGEventCreateKeyboardEvent(None, 63, True)
Quartz.CGEventPost(Quartz.kCGSessionEventTap, evt)
Чтобы отправить ключ вверх событие, просто изменить что True
к False
.
[Этот вопрос] (http://stackoverflow.com/questions/21396985/how-to-use-cgeventcreatekeyboardevent-in-python-on-mac) может быть полезен для изучения того, как использовать 'CGEventCreateKeyboardEvent'. Также, COYG! – dano
Связанный вопрос спрашивает, как использовать iOS API из OS X, поэтому я не уверен, насколько он полезен. Посмотрите API OS X (который не будет запускаться с 'UI' и, что более важно, который будет частью библиотеки разработчиков Mac, а не библиотеки разработчиков iOS), а затем вы можете посмотреть, можете ли вы использовать их через , например, PyObjC или AppleEvents. – abarnert
Кроме того, я точно не помню, но я думаю, что Quartz.CGEventCreateKeyboardEvent' может быть одной из функций, которые были нарушены PyObjC 2.5, а поскольку Apple включает в себя 2.5.1 с предустановленным Python 2.7 от 10.7 до 10.10 , вы можете получить ошибки, которые не имеют смысла. Попробуйте и посмотрите; если вы это сделаете, перейдите на PyObjC 3.0 или новее. – abarnert