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