Нажатие клавиши реализации в Swift

Я пишу приложение, которое будет использовать ваш телефон в качестве тачпада и имитировать различные жесты тачпада с помощью кода Swift на Mac. Но когда я попытался реализовать перелистывание между рабочими пространствами (так же, как пролистывание тремя пальцами по сенсорной панели), поскольку его можно вызвать с помощью <kbd>control + стрелка</kbd>, я столкнулся с проблемой вызова нажатия клавиши.

Я просмотрел это обсуждение и написал типа

func rightScreen() {
    let key = CGEvent(keyboardEventSource: nil, virtualKey: 0x7C, keyDown: true)
    key?.flags = .maskControl
        
    key?.post(tap: .cghidEventTap)
}

но это работает так же, как простой щелчок стрелкой. Как я могу заставить его работать правильно?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Публикуя событие нажатия клавиши, вам необходимо учитывать события как 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:)

В ссылке также говорится: «Необходимо ввести все нажатия клавиш, необходимые для создания символа, включая клавиши-модификаторы». Можно ли опустить события Control down и up?

Willeke 04.06.2024 13:48

@Willeke Модификаторы задаются в наборе опций flags.

Alexander 04.06.2024 15:53

Таким образом, события keydown и keyup управляющей клавиши можно опустить? В документации говорится: «Например, чтобы создать букву «Z», клавиша SHIFT должна быть нажата, клавиша «z» должна быть нажата, а затем клавиши SHIFT и «z» должны быть отпущены». Документация неправильная?

Willeke 04.06.2024 23:14

Я попробовал эту реализацию и немного изменил ее, но по какой-то причине она работает только время от времени, но эта часть кода вызывает всегда

BrainPumpkin 06.06.2024 00:30

@Willeke: Да, вы можете не публиковать отдельные события клавиш-модификаторов, если установите флаги. Я не знаю, делает ли это документацию неправильной.

soundflix 08.06.2024 04:22

@BrainPumpkin: Что у тебя не работает?

soundflix 09.06.2024 00:51

@soundflix Он должен вызывать элемент управления + стрелка, но в основном он вызывает простое нажатие стрелки, а иногда и обычную комбинацию. Я также пытался отдельно вызвать controlDown,arrowDown,arrowUp и controlUp, но ничего не изменилось.

BrainPumpkin 10.06.2024 14:32
Ответ принят как подходящий

Касание события показывает, что на клавишах со стрелками установлен флаг .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)
}

Другие вопросы по теме