РЕДАКТИРОВАТЬ - не получаю много информации об этом, так что это тощий. Я публикую события клавиатуры в PSN. Затем я переключаюсь в другое окно, публикую еще несколько событий (на этот раз на уровне сеанса) и переключаюсь в первое окно. Когда я снова начинаю отправлять сообщения в PSN, ничего не происходит. Пока я не двигаю мышь или колесо прокрутки. Почему это так и как я могу обойти это (если не исправить)?
ОРИГИНАЛ -
Если я настрою цикл, который публикует некоторые события клавиатуры в PSN, я нахожу, что он работает нормально, за исключением первого запуска. Событие появляется, когда я что-то делаю с помощью мыши вручную - даже слегка перемещая его. Вот подробности, если они помогут.
Внешнее приложение имеет окно со списком текстовых строк, которые я читаю, публикуя команды копирования (и проверяя монтажную область). К сожалению, это мой единственный способ получить этот текст.
Иногда приложение отводит фокус от списка, который я могу обнаружить. Когда это происходит, самый надежный способ вернуть фокус - это послать событие мыши, чтобы щелкнуть текстовое поле прямо над списком, а затем отправить событие клавиатуры «tab», чтобы переместить фокус на список.
Итак, при запуске цикл работает нормально, прокручивая список вниз и копируя текст. Когда фокус смещен, его обнаруживают нормально, и события отправляются, чтобы переместить фокус обратно в список. Но ничего не происходит. Цикл продолжает обнаруживать, что фокус изменился, но события работают, только когда я перемещаю мышь. Или даже просто используйте колесо прокрутки. Странно.
Как только это произошло в первый раз, все работает нормально - каждый раз, когда фокус перемещается, события PSN переключают его обратно, и мне вообще ничего не нужно делать.
Вот код, который выполняется в цикле - проверено как работающее:
//copy to pasteboard - CMD-V
e3 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, true);
CGEventSetFlags(e3, kCGEventFlagMaskCommand);
CGEventPostToPSN(&psn, e3);
CFRelease(e3);
e4 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, false);
CGEventPostToPSN(&psn, e4);
CFRelease(e4);
//move cursor down
e1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)125, true);
CGEventPostToPSN(&psn, e1);
CFRelease(e1);
e2 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)125, false);
CGEventPostToPSN(&psn, e2);
CFRelease(e2);
А вот где я переключаю фокус, тоже работаю (кроме случаев, когда это требуется сначала):
//click in text input box - point is derived earlier
e6 = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, point, 0);
CGEventPostToPSN(&psn, e6);
CFRelease(e6);
e7 = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, point, 0);
CGEventPostToPSN(&psn, e7);
CFRelease(e7);
//press tab key to move to chat log table
CGEventRef e = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)48, true);
//CGEventPost(kCGSessionEventTap, e);
CGEventPostToPSN(&psn, e);
CFRelease(e);
CGEventRef e11 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)48, false);
CGEventPostToPSN(&psn, e11);
CFRelease(e11);