Основная обработка событий с основной графикой - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь обрабатывать события с основной графикой и основным финансированием в Mac OS.

Мой код:

#import <CoreGraphics/CoreGraphics.h>
#import <CoreFoundation/CoreFoundation.h>

static int counter = 0;

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {

    printf("event 0x%i\n ", counter++);

    return event;
}


int main(int argc, const char * argv[]) {


    CFRunLoopRef runner = CFRunLoopGetCurrent();





    CFMachPortRef mach = CGEventTapCreate(kCGHIDEventTap,kCGTailAppendEventTap , kCGEventTapOptionDefault, kCGEventMaskForAllEvents, myCGEventCallback, NULL);


    CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, mach, 0);

    CFRunLoopAddSource(runner, runLoopSource, kCFRunLoopCommonModes);

    CGEventTapEnable(mach, true);


    CFRunLoopRun();

    printf("end\n");



}

Но реагирует только на события тачпада.События клавиатуры, похоже, игнорируются моей программой.Я пытался изменить маски событий, но у меня ничего не получается.Можешь дать какой-нибудь совет?

PS

Это хорошее начало для обработки событий?Я хочу сделать полноэкранную игру OpenGL с основной графикой без таких библиотек, как SFML или SDL.Я использую CGDisplayCapture и CGL для создания контекста OpeGL.

1 Ответ

0 голосов
/ 17 декабря 2018

Чтобы ответить на вопрос о вашем вопросе: чтобы получать события клавиатуры через CGEventTap, ваше приложение должно быть доверенным для управления вашим компьютером с помощью API доступа.Это означает, что он должен быть в списке приложений в Системных настройках -> Безопасность и конфиденциальность -> Доступность.Вы можете использовать функцию AXProcessIsTrustedWithOptions, чтобы запросить это разрешение;Вы должны быть подписаны кодом, но не помещены в «песочницу», и должны быть упакованы как .app для добавления в список доверенных приложений.

Что касается вашего второго вопроса, если это хороший способ справитьсясобытия для игры ... не совсем, нет.Используйте API NSEvent / NSApplication, чтобы получить информацию для вашего приложения.CGEventTap - лучший выбор, когда вы хотите получить события для всего пользовательского сеанса или другого приложения, чтобы сделать что-то вроде перехвата пользовательского ввода, чтобы сделать что-то нестандартное, когда другое приложение находится на первом плане (как часто приходится делать вспомогательным приложениям).В частности, передав kCGHIDEventTap, вы запросили, чтобы события были доставлены в ваше приложение в тот момент, когда они поступают на сервер окна ... это может легко привести к ошибке в вашем приложении, которая может сделать сеанс непригодным (скажем, случайно отбрасыватьвсе входные данные для сеанса).

...