Как узнать, из какого приложения исходит CGEventRef? - PullRequest
0 голосов
/ 17 января 2011

Я успешно получил демонстрационное приложение, перехватывающее события клавиатуры.Вот обработчик для них.

CGEventRef keyUpCallback (CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
    NSLog(@"KeyUp event tapped!");
    return;
}

Я хочу делать разные вещи в зависимости от того, какое приложение отправило событие.Как я могу узнать, какое приложение это?

Ответы [ 3 ]

2 голосов
/ 17 января 2011

Приложение, которое получает нажатия клавиш, предположительно является активным приложением, поэтому вы можете обрабатывать событие по-разному в зависимости от того, какое приложение активно. Вы можете использовать метод activeapplication из NSWorkspace , чтобы получить имя активного приложения.

См. Также эту ветку о получении активного приложения.

1 голос
/ 24 ноября 2013

Вот как это происходит:

int64_t processIdTarget = CGEventGetIntegerValueField(event, kCGEventTargetUnixProcessID);
int64_t processIdSource = CGEventGetIntegerValueField(event, kCGEventSourceUnixProcessID);

processIdSource показывает отправителя приложения, а processIdTarget означает получателя.

Например, вы можете открыть виртуальную клавиатуру и отправлять с нее события. Поскольку виртуальная клавиатура является процессом в пользовательском пространстве, вы получите ее pid как processIdSource. Но в большинстве случаев вы получите 0 как processIdSource.

После того как вы получили pid приложения, вы можете создать экземпляр NSRunningApplication и получить от него кучу информации.

0 голосов
/ 05 августа 2013

Показывает идентификатор процесса приложения, отправившего событие:

NSLog(@"Target PID:%lld",CGEventGetIntegerValueField(event, kCGEventTargetUnixProcessID));
...