Выполнение событий клавиатуры из 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);