Я работаю над приложением C ++ для удаленного управления, которое отправляет события ввода ключа в macs, когда пользователь на другом компьютере печатает.Ранее приложение использовало устаревший код для ввода ключей:
CGError error = CGPostKeyboardEvent(0, nativeKeyCode, isPressed);
Но у этого были проблемы с клавишами-модификаторами, такими как Caps Lock, и мы хотели обновить код, чтобы он больше не вызывал устаревшие функции.
После некоторых исследований я получил клавишу-модификатор Caps Lock, работающую с использованием не устаревшей функции CGEventCreateKeyboardEvent
:
CGEventRef event = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)nativeKeyCode, isPressed);
CGEventPost(kCGHIDEventTap, event);
CFRelease(event);
Однако, когда пользователь из приложения удаленного управления выходит из системыMac и переходит на экран входа Mac, эта функция не работает при вводе пароля на этом экране.Я могу распечатать журналы вокруг каждого оператора, и я поместил все в try-catch, но исключений и других явных ошибок не возникает.Я воспроизвел эту проблему на macOS High Sierra, но она также была воспроизведена на macOS Sierra.
Из того, что я видел в документации Apple , нет способавыполнять проверку ошибок на этих конкретных функциях, кроме проверки, является ли созданное событие нулевым.При тестировании этого сценария event
создавался успешно и был не нулевым .
Я искал любую информацию, связанную с этим, но не нашел никого с этой конкретной проблемойна экране входа Mac.Следует отметить, что устаревший код прекрасно работал на экране входа в систему, а текущий код прекрасно работает на экране блокировки и в любом другом месте на Mac;сбой на экране входа в систему происходит только тогда, когда пользователь полностью вышел из системы .
Кто-нибудь еще видел эту проблему и знал о ее решении?Или что-то явно не так с кодом ввода ключа?