Глобальные перемещения мыши в событиях Cocoa

Есть ли способ зарегистрировать глобальные события с перемещением мыши в Cocoa? Я смог зарегистрироваться для событий с использованием Carbon InstallEventHandler(), но предпочел бы эквивалент Cocoa. Я искал события NSNotificationCenter, но, похоже, нет публичных имен событий (есть ли частные?)

В качестве альтернативы, есть ли способ использовать NSTrackingArea для представлений с фоном clearColor?

Приложение Snow Leopard только.

Ответ 1

В SnowLeopard есть новый метод класса на NSEvent, который делает именно то, что вы хотите: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block. Вы хотите mask = NSMouseMovedMask.

Ответ 2

Аналогичный вопрос уже задан в StackOverflow: Как сделать прозрачный элемент подкаста NSView обработать события мыши?

Подводя итог, метод tansparent view не работал. Кварцевые муфты событий - лучший ответ.

Вот несколько советов по работе с кранами:

  • Создайте кран с помощью CGEventTapCreate.
    a) Для параметра location (first) вы, вероятно, захотите использовать kCGSessionEventTap.
    b) Для параметра размещения (второго) вы, вероятно, захотите kCGHeadInsertEventTap.
    c) Для параметра маски события попробуйте (1 << kCGEventMouseMoved).

  • Создайте источник цикла запуска с помощью CFMachPortCreateRunLoopSource, передав ответ в качестве второго параметра.

  • Добавьте источник цикла запуска в цикл выполнения. Предполагая, что вы хотите, чтобы он был добавлен в цикл основного запуска, выполните: CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);

  • Включить ответ на событие с помощью CGEventTapEnable

Ответ 3

Если вы хотите отследить мышь независимо от того, где она находится, вам нужен CGEventTap. Нет эквивалента Cocoa. Если вы просто хотите отследить его в своем приложении, тогда вы должны объяснить, почему вы не можете сделать это немного более основательно.