Выполнение событий клавиатуры из Daemon в Mac с использованием CFEvents

У меня есть следующий код в демоне (Root Process), который имитирует события клавиатуры в OSX.

CGEventRef keyEvent = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)keyCode, keyDown);
CGEventPost(kCGHIDEventTap, keyEvent);
CFRelease(keyEvent);

Когда я нахожусь в User1 и демон загружен в контекст Root, события клавиатуры симулируются нормально. Когда я переключаюсь на User2, все события, кроме клавиши Shift, выполняются успешно. По какой-то причине событие клавиатуры для клавиши Shift выполняется в User1, хотя я в настоящее время вошел в User2.

Я также пытался использовать маску сдвига:

CGEventRef  event1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)keyCode, true);//'z' keydown event
CGEventSetFlags(event1, kCGEventFlagMaskShift);//set shift key down for above event
CGEventPost(kCGHIDEventTap, event1);//post event
CFRelease(event1);

Это тоже хорошо работает в User1. Когда я переключаюсь на user2 и выполняю ключевые события, как показано выше, он выполняет эти события в самом переднем приложении в User1. События нажатия клавиши Shift или любого нажатия клавиши с маской Shift переходят к Пользователю1, а не к текущему пользователю, вошедшему в систему.

Могу ли я в любом случае убедиться, что события клавиатуры выполняются вошедшим в систему пользователем?

1 ответ

После того, как вы создадите keyEventУстановите флаги модификатора перед публикацией:

CGEventFlags flags = kCGEventFlagMaskShift;
CGEventSetFlags(keyEvent, modifierFlags);
Другие вопросы по тегам