У меня есть следующий код для отправки виртуальных нажатий клавиш в процесс данного идентификатора процессаВиртуальное нажатие идет на неправильное применение
NSRunningApplication* app = [NSRunningApplication
runningApplicationWithProcessIdentifier: pid];
[app activateWithOptions: (NSApplicationActivateAllWindows | NSApplicationActivateIgnoringOtherApps)];
event1 = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)cg_key_code, true);
event2 = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)cg_key_code, false);
CGEventPost(kCGHIDEventTap, event1);
CGEventPost(kCGHIDEventTap, event2);
Процесс, который я хочу, чтобы отправить нажатие клавиш, чтобы быстро приходит на фронт, как и ожидался. Но проблема в том, что первое нажатие на кнопку переходит к приложению, которое было впереди, прежде чем мое приложение вышло вперед. При тестировании [app isActive]
возвращает false в первый раз. После первого ключа все идет хорошо.
Почему это происходит? Несмотря на то, что я отправил ключевое событие после того, как получил мой процесс на фронт.
Хорошая идея. Но есть проблема. 'app' никогда не узнает, что его активный и цикл while никогда не заканчиваются. Чтобы преодолеть это, я попытался получить 'app' дескриптор каждый раз внутри цикла. Но это как-то значительно замедляет мое приложение от выхода на передний план. Я не уверен, почему изменения в моем коде не позволяют ОС переносить мое приложение на передний план. –
. Попробуйте увеличить время от 0,05 до 0,1, а не то, что ваш процесс забивает немного процессорного времени, должен быть серьезной проблемой для современной ОС. – Wain
Я сделал он работает с 0,05, но, как я уже говорил, мне нужно каждый раз получать новый дескриптор приложения внутри цикла. (Задержка, о которой я упомянул в предыдущем комментарии, ушла, как-то!) Я отредактирую ваш ответ, чтобы включить этот факт и принять ваш ответ. –