2016-09-22 4 views
1

Я имитирую нажатия клавиш в macOS и отправляю их в активное приложение. Я делаю это по линии https://stackoverflow.com/a/27487493/5600424 но в Swift 3. Например, чтобы послать 'A':Имитировать нажатия клавиш с событиями кварца в macOS Sierra

let eventSource = CGEventSource(stateID: CGEventSourceStateID.hidSystemState) 
let key: CGKeyCode = 0  // virtual key for 'a' 
let eventDown = CGEvent(keyboardEventSource: eventSource, virtualKey: key, keyDown: true) 
let eventUp = CGEvent(keyboardEventSource: eventSource, virtualKey: key, keyDown: false) 
let location = CGEventTapLocation.cghidEventTap 
eventDown.post(tap: location) 
eventUp.post(tap: location) 

Это работает отлично на OSX El Capitan (Swift 3, Xcode 8.0), но он остановился работая после обновления в macOs Sierra. Само приложение по-прежнему получает нажатие клавиши, когда оно активно, однако, когда активное приложение активно, события кажутся потерянными. Я попытался выяснить, что происходит без успеха, и документация не помогает. Любая помощь будет оценена, спасибо!

+0

Вы пробовали разместить проводку в другом месте контакта, например 'CGEventTapLocation.cgSessionEventTap'? Или, если вы ориентируетесь на конкретное приложение, используя 'postToPSN()'? –

+0

Привет @Ken, я не нацелен на конкретное приложение, я бы хотел, чтобы активное окно приложения переднего плана получало события (с которыми пользователь взаимодействует). Это работало так, как я думал о пред-сиррее. Я также попробовал 'CGEventTapLocation.cgSessionEventTap', но поведение не меняется: события игнорируются, если я переключаюсь на другое приложение. Возможно, правильный способ сделать это - отследить приложение переднего плана с помощью 'NSWorkspace.shared(). RunningApplications.first (где: {$ 0.isActive})' и использовать 'postToPSN()'? – tin

+1

Ну, было бы правильнее использовать 'NSWorkspace.shared(). FrontmostApplication'. ;) Вы можете, конечно, попробовать это. Возможно также, что Sierra ужесточила безопасность сообщений о событиях, и вам необходимо иметь вспомогательный доступ, как вам нужно для ключевого прослушивания событий. –

ответ

1

Код, указанный в вопросе, работает правильно, и его поведение не изменилось при обновлении с El Capitan до Sierra, в отличие от заявленных.

Клавиши, которые не были получены другими приложениями, потому что, как только приложение было в фоновом режиме, функция, ответственная за отправку событий клавиатуры с вышеуказанным кодом, больше не вызывалась по независимым причинам.

Смежные вопросы