2011-05-31 116 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); 
}