У меня есть глобальное приложение, которое предотвращает перемещение мыши по областям экрана.Должен работать со всеми приложениями, в то время как мое приложение в фоновом режиме и т. Д.
Я установил хук CGEventTap
, который имеет функцию обратного вызова для движений мыши.
Движение мыши пользователя продолжаетпройти через крюк, независимо от того, как я пытаюсь изменить / убить движение.Это отражает опыт других: https://stackoverflow.com/a/5831573/106761
- (CGEventRef) mouseMovedEvent:(CGEventRef) newUserMouseMovement
{
//Attempt to modify the mouse movement
CGEventSetDoubleValueField(newUserMouseMovement, kCGMouseEventDeltaX, 0);
CGEventSetDoubleValueField(newUserMouseMovement, kCGMouseEventDeltaY, 0);
CGEventSetDoubleValueField(newUserMouseMovement, kCGMouseEventDeltaX, 0.0);
//Attempt to kill the event
return NULL;
}
//Mouse movement still works normally.
I am , способный использовать CGDisplayMoveCursorToPoint
или CGWarpMouseCursorPosition
для перемещения курсора обратно в исходное положение.
Это работает нормально, хотя я бы предпочел просто полностью убить событие.
Проблема в том, что исходное движение мыши пользователя показывает визуальный курсор в этой точке в течение доли секунды,прежде чем я смогу переместить курсор.
Я использую:
CGSetLocalEventsSuppressionInterval(0.0);
, чтобы увеличить частоту, с которой начинается движение мыши.Но это также делает «реальный» курсор, прежде чем я его переместлю, мигает в «запрещенной зоне», если пользователь удерживает мышь напротив области, в которую я не хочу, чтобы она двигалась.
Я буду потенциально использовать: Глобально скрывающий курсор (из фонового приложения) , но я сомневаюсь, что это будет законно для Mac App Store.
Есть идеи?
РЕДАКТИРОВАТЬ: Как создать событие нажмите:
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, kCGEventMaskForAllEvents, myCGEventCallback, NULL);
...
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
if (type == kCGEventMouseMoved) {
event = [refToSelf mouseMovedEvent:event];
}
...
return event;
}