2011-05-31 98 views
8

我正在开发一个桌面应用程序,我应该能够在透明窗口上捕捉鼠标事件。但是,透明的NSWindow并不需要鼠标事件。所以,我已经将setIgnoreMouseEvents设置为NO,它允许透明窗口采取鼠标事件。有条件地在透明窗口上处理鼠标事件

我在以下情况下有问题: 在此窗口上有动态创建的矩形形状。透明窗口不应该在该区域使用鼠标事件;它应该被委托给这个形状背后的窗口(一些其他应用程序)。 为此,如果mouseDown事件在形状中,我将setIgnoreMouseEvents设置为YES。现在,如果用户在形状外部的区域中执行鼠标事件,则透明窗口应该执行该事件。由于setIgnoreMouseEvents设置为YES,窗口不会采用鼠标事件。

无法识别mouseDown事件发生,因此我可以将setIgnoreMouseEvents设置为NO。

有人可能会建议我一些最好的方法来处理透明窗口上的鼠标事件吗?

迪帕

+0

可能重复[如何使用非矩形按钮创建透明窗口?](http://stackoverflow.com/questions/1527907/how-to-create-a-transparent-window-with-non-rectangular-buttons) – Ben 2012-06-21 10:14:11

+1

The magic你正在寻找的词是“命中测试”。这就是窗口如何配合确定鼠标是否应该被视为在窗口之上的过程。 – Ben 2012-06-21 10:15:27

+0

我建议你只为该矩形创建一个跟踪区域,并从视图中的响应者链中截取,然后将其委派给想要捕获所需事件的窗口。 – Arvin 2013-03-12 05:04:22

回答

3

我刚刚碰到石英事件丝锥,这基本上让你捕获鼠标事件和执行自己的回调。

还没有尝试过了自己,但好像你应该能够检查在鼠标点击下跌和值

这里有条件的执行是一个example:中

//--------------------------------------------------------------------------- 
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); 
}