Глобальные события перемещения мыши в какао - PullRequest
10 голосов
/ 27 октября 2009

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

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

Приложение только снежный барс.

Ответы [ 3 ]

23 голосов
/ 27 октября 2009

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

12 голосов
/ 27 октября 2009

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

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

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

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

  2. Создайте источник цикла выполнения с CFMachPortCreateRunLoopSource, передавая событие в качестве второго параметра.

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

  4. Включите запись события с помощью CGEventTapEnable

3 голосов
/ 27 октября 2009

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

...