Симуляция CTRL + пробел для переключения ввода с клавиатуры с помощью CGEvent отображает меню переключения клавиатуры - PullRequest
0 голосов
/ 23 февраля 2020

Существует известная ошибка, при которой выбор источников входного сигнала CJVK с помощью TISSelectInputSource не работает.

Решение kawa имеет , в результате чего включает в себя использование ярлыка Select the previous input source (по умолчанию CTRL-пробел).

Вот код, который я использовал для имитации ярлыка:

    let spaceDown = CGEvent(keyboardEventSource: nil, virtualKey: UInt16(kVK_Space), keyDown: true)
    let spaceUp = CGEvent(keyboardEventSource: nil, virtualKey: UInt16(kVK_Space), keyDown: false)

    spaceDown?.flags = .maskControl
    spaceUp?.flags = .maskControl

    spaceDown?.post(tap: .cghidEventTap)
    spaceUp?.post(tap: .cghidEventTap)

Однако, когда он запускается, отображается всплывающее окно источников ввода с клавиатуры ( вместо простого переключения источника):

enter image description here

Это меню отображается, когда вы удерживаете CTRL-Пробел, а не когда Вы просто активируете команду.

Забавное поведение, которое я заметил, состоит в том, что перемещение мыши или нажатие любой клавиши приводит к исчезновению всплывающего окна, что не является причиной, когда вы удерживаете CTRL- Пробел.

Вопрос в том, как получить реальный результат, который я хочу получить от излучения CGEvents?

1 Ответ

0 голосов
/ 24 февраля 2020

Как отмечает @Willeke, решение состоит в том, чтобы опубликовать CTRL CGEvent (даже если вы установите свойство .flags):

    let spaceDown = CGEvent(keyboardEventSource: nil, virtualKey: UInt16(kVK_Space), keyDown: true)
    let spaceUp = CGEvent(keyboardEventSource: nil, virtualKey: UInt16(kVK_Space), keyDown: false)

    let ctrlDown = CGEvent(keyboardEventSource: nil, virtualKey: UInt16(kVK_Control), keyDown: true)
    let ctrlUp = CGEvent(keyboardEventSource: nil, virtualKey: UInt16(kVK_Control), keyDown: false)

    spaceDown?.flags = .maskControl
    spaceUp?.flags = .maskControl

    ctrlDown?.post(tap: .cghidEventTap)
    spaceDown?.post(tap: .cghidEventTap)
    spaceUp?.post(tap: .cghidEventTap)
    ctrlUp?.post(tap: .cghidEventTap)

    CGEvent.init(source: nil)?.post(tap: .cghidEventTap)

Интересное поведение, которое я заметил, заключается в том, что, если я изменю клавиатуру ярлык, чтобы включить больше модификаторов (например, CMD, Option, Shift), он продолжает работать, несмотря на то, что я генерирую только событие CTRL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...