Условная обработка событий мыши в прозрачном окне - PullRequest
9 голосов
/ 31 мая 2011

Я занимаюсь разработкой настольного приложения, в котором я должен иметь возможность получать события мыши в прозрачном окне.Но прозрачный NSWindow не принимает события мыши.Итак, я установил для setIgnoreMouseEvents значение NO, что позволяет прозрачному окну принимать события мыши.

У меня проблема в следующем сценарии: в этом окне динамически создается прямоугольная форма.Прозрачное окно не должно принимать события мыши в этой области;его следует делегировать окну (какого-либо другого приложения), которое находится за этой формой.Для этого, если событие mouseDown находится внутри фигуры, я устанавливаю для setIgnoreMouseEvents значение YES.Теперь, если пользователь выполняет события мыши в области за пределами фигуры, прозрачное окно должно принять событие.Поскольку для setIgnoreMouseEvents задано значение YES, окно не принимает события мыши.

Нет способа определить, что произошло событие mouseDown, поэтому я могу установить для setIgnoreMouseEvents значение NO.

Может кто-то предложитьмне лучший метод для обработки событий мыши в прозрачном окне?

Deepa

1 Ответ

3 голосов
/ 22 января 2015

Я только что натолкнулся на Quartz Event Taps, который в основном позволяет вам захватить событие мыши и выполнить свой собственный обратный вызов.

Сам не пробовал, но, похоже, вы должны быть в состояниипроверить, куда упал щелчок мыши, и выполнить условно значения

Вот пример :

//---------------------------------------------------------------------------  
 CGEventRef MouseTapCallback( CGEventTapProxy aProxy, CGEventType aType, CGEventRef aEvent, void* aRefcon )   
 //---------------------------------------------------------------------------  
 {  
    if( aType == kCGEventRightMouseDown ) NSLog( @"down" );  
    else if( aType == kCGEventRightMouseUp ) NSLog( @"up" );  
    else NSLog( @"other" );  

   CGPoint theLocation = CGEventGetLocation(aEvent);  
   NSLog( @"location x: %d y:%d", theLocation.x, theLocation.y );  

   return aEvent;   
 }   

 //---------------------------------------------------------------------------  
 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification   
 //---------------------------------------------------------------------------  
 {  
   CGEventMask theEventMask = CGEventMaskBit(kCGEventRightMouseDown) |  
                 CGEventMaskBit(kCGEventRightMouseUp);  

   CFMachPortRef theEventTap = CGEventTapCreate( kCGSessionEventTap,   
                          kCGHeadInsertEventTap,   
                          0,   
                          theEventMask,   
                          MouseTapCallback,   
                          NULL );   

   if( !theEventTap )   
   {  
     NSLog( @"Failed to create event tap!" );  
   }   

   CFRunLoopSourceRef theRunLoopSource =   
     CFMachPortCreateRunLoopSource( kCFAllocatorDefault, theEventTap, 0);   

   CFRunLoopAddSource( CFRunLoopGetCurrent(),  
                       theRunLoopSource,   
                       kCFRunLoopCommonModes);   
   CGEventTapEnable(theEventTap, true);  
 }  
...