Я пишу приложение, которое будет использовать ваш телефон в качестве тачпада и имитировать различные жесты тачпада с помощью кода Swift на Mac. Но когда я попытался реализовать перелистывание между рабочими пространствами (так же, как пролистывание тремя пальцами по сенсорной панели), поскольку его можно вызвать с помощью <kbd>control + стрелка</kbd>, я столкнулся с проблемой вызова нажатия клавиши.
Я просмотрел это обсуждение и написал типа
func rightScreen() {
let key = CGEvent(keyboardEventSource: nil, virtualKey: 0x7C, keyDown: true)
key?.flags = .maskControl
key?.post(tap: .cghidEventTap)
}
но это работает так же, как простой щелчок стрелкой. Как я могу заставить его работать правильно?
Публикуя событие нажатия клавиши, вам необходимо учитывать события как keyDown
, так и keyUp
. keyUp
необходимо вводить вручную после keyDown
, иначе ключ будет бесконечно заблокирован.
Итак, используйте это вместо этого:
func rightScreen() {
let keyDown = CGEvent(keyboardEventSource: nil, virtualKey: 0x7C, keyDown: true)
keyDown?.flags = .maskControl
let keyUp = CGEvent(keyboardEventSource: nil, virtualKey: 0x7C, keyDown: false)
keyUp?.flags = .maskControl
keyDown?.post(tap: .cghidEventTap)
keyUp?.post(tap: .cghidEventTap)
}
Ссылка: init(keyboardEventSource:virtualKey:keyDown:)
@Willeke Модификаторы задаются в наборе опций flags
.
Таким образом, события keydown и keyup управляющей клавиши можно опустить? В документации говорится: «Например, чтобы создать букву «Z», клавиша SHIFT должна быть нажата, клавиша «z» должна быть нажата, а затем клавиши SHIFT и «z» должны быть отпущены». Документация неправильная?
Я попробовал эту реализацию и немного изменил ее, но по какой-то причине она работает только время от времени, но эта часть кода вызывает всегда
@Willeke: Да, вы можете не публиковать отдельные события клавиш-модификаторов, если установите флаги. Я не знаю, делает ли это документацию неправильной.
@BrainPumpkin: Что у тебя не работает?
@soundflix Он должен вызывать элемент управления + стрелка, но в основном он вызывает простое нажатие стрелки, а иногда и обычную комбинацию. Я также пытался отдельно вызвать controlDown,arrowDown,arrowUp и controlUp, но ничего не изменилось.
Касание события показывает, что на клавишах со стрелками установлен флаг .maskSecondaryFn
(а на стрелках fn — нет). Этот код эмулирует события ручного нажатия Control-Стрелка вправо:
func rightScreen() {
guard let controlDown = CGEvent(keyboardEventSource: nil, virtualKey: 0x3B, keyDown: true) else {
return
}
controlDown.flags = .maskControl
guard let keyDown = CGEvent(keyboardEventSource: nil, virtualKey: 0x7C, keyDown: true) else {
return
}
keyDown.flags = [.maskControl, .maskSecondaryFn]
guard let keyUp = CGEvent(keyboardEventSource: nil, virtualKey: 0x7C, keyDown: false) else {
return
}
keyUp.flags = [.maskControl, .maskSecondaryFn]
guard let controlUp = CGEvent(keyboardEventSource: nil, virtualKey: 0x3B, keyDown: false) else {
return
}
controlDown.post(tap: .cghidEventTap)
keyDown.post(tap: .cghidEventTap)
keyUp.post(tap: .cghidEventTap)
controlUp.post(tap: .cghidEventTap)
}
В ссылке также говорится: «Необходимо ввести все нажатия клавиш, необходимые для создания символа, включая клавиши-модификаторы». Можно ли опустить события Control down и up?