Ответ 1
В SnowLeopard есть новый метод класса на NSEvent
, который делает именно то, что вы хотите: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block
. Вы хотите mask = NSMouseMovedMask
.
Есть ли способ зарегистрировать глобальные события с перемещением мыши в Cocoa? Я смог зарегистрироваться для событий с использованием Carbon InstallEventHandler()
, но предпочел бы эквивалент Cocoa. Я искал события NSNotificationCenter
, но, похоже, нет публичных имен событий (есть ли частные?)
В качестве альтернативы, есть ли способ использовать NSTrackingArea
для представлений с фоном clearColor
?
Приложение Snow Leopard только.
В SnowLeopard есть новый метод класса на NSEvent
, который делает именно то, что вы хотите: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block
. Вы хотите mask = NSMouseMovedMask
.
Аналогичный вопрос уже задан в StackOverflow: Как сделать прозрачный элемент подкаста NSView обработать события мыши?
Подводя итог, метод tansparent view не работал. Кварцевые муфты событий - лучший ответ.
Вот несколько советов по работе с кранами:
Создайте кран с помощью CGEventTapCreate
.
a) Для параметра location (first) вы, вероятно, захотите использовать kCGSessionEventTap
.
b) Для параметра размещения (второго) вы, вероятно, захотите kCGHeadInsertEventTap
.
c) Для параметра маски события попробуйте (1 << kCGEventMouseMoved)
.
Создайте источник цикла запуска с помощью CFMachPortCreateRunLoopSource
, передав ответ в качестве второго параметра.
Добавьте источник цикла запуска в цикл выполнения. Предполагая, что вы хотите, чтобы он был добавлен в цикл основного запуска, выполните:
CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);
Включить ответ на событие с помощью CGEventTapEnable
Если вы хотите отследить мышь независимо от того, где она находится, вам нужен CGEventTap. Нет эквивалента Cocoa. Если вы просто хотите отследить его в своем приложении, тогда вы должны объяснить, почему вы не можете сделать это немного более основательно.