2011-06-13 27 views
2

我正在從Windows向OSX移植一個應用程序(或者更準確地說,一個VST插件)。我對OSX編程有點新,但我使用HICocoaCreateView將Cocoa NSView添加到Carbon窗口(我從主機獲得)。在我的NSView的窗口外部獲取mouseMoved/mouseDragged

Anywhoo ...這個視圖裏面我想要mouseMoved & mouseDragged事件,但拖動時,我也想要獲得這些事件,即使當鼠標離開我的NSView(也是父窗口),但我只是'似乎使這發生。

在windows上,我會在mouseDown上做一個SetCapture來獲取所有鼠標事件一段時間。我在Cocoa找到的最接近的東西是「addGlobalMonitorForEventsMatchingMask」,但這只是10.6+,我很難相信這是在此之前無法做到的事情。 (畢竟,這是通常用於可拖動組件的東西,如滾動條等)

這讓我瘋狂!

UPDATE:

有一種叫做CGEventTapCreate以及其中,據我可以從稀缺文檔來講,類似於addGlobalMonitor ...但在碳。我還沒有掌握Carbon和Cocoa如何與彼此相關以及在哪裏工作。即使我的主要東西是可可,它是否可用? (窗口我從主機獲得既可以是可可和碳。這真是所有一團糟。)

回答

2

CGEventTap東西不是真的碳。它在Quartz中,可以被看作Cocoa的子框架(它實際上只是其他框架的集合)。 Carbon是一個遺留(並且被棄用的)框架,它被創建用於簡化在Mac OS 9(其中應用程序編程主要在C中完成)和Mac OS X(其中使用Objective-C)之間的轉換。並非Apple提供的每個C函數都是Carbon; Quartz和Grand Central Dispatch spring立即將它作爲使用C的現代框架(我相信它具有輕微的速度優勢)。

將背景排除在外後,這些函數在Cocoa代碼中工作得很好。據我所知,addGlobalEventMonitor...addLocalEventMonitor...只是圍繞CGEventTap s的Obj-C包裝。

我認爲一個CGEventTap是要走的路。他們的文檔很少,是的,但他們很直接。 Dave DeLong對this SO question的回答可能會使你走上正確的道路。

+0

感謝您的澄清。我認爲這實際上比所提議的解決方案更有幫助,但事件點擊確實指出了我的正確方向。我實際上重拍了我的代碼,不使用HICocoaCreateView,因爲我隨機崩潰時遇到麻煩,而且使用我的新代碼,即使沒有事件點擊,我也會得到我想要的行爲:)) – Dentoid 2011-06-20 15:41:42

1

我猜你需要做這樣的事情......

EventHandlerRef  m_ApplicationMouseDragEventHandlerRef;   
EventHandlerRef  m_MonitorMouseDragEventHandlerRef; 

{ 
    OSStatus ErrStatus; 

    static const EventTypeSpec kMouseDragEvents[] = 
     { 
     { kEventClassMouse, kEventMouseDragged } 
     }; 

    ErrStatus = InstallEventHandler(GetEventMonitorTarget(), NewEventHandlerUPP(MouseHasDragged), GetEventTypeCount(kMouseDragEvents), kMouseDragEvents, this, &m_MonitorMouseDragEventHandlerRef); 

    ErrStatus = InstallApplicationEventHandler(NewEventHandlerUPP(MouseHasDragged), GetEventTypeCount(kMouseDragEvents), kMouseDragEvents, this, &m_ApplicationMouseDragEventHandlerRef); 

    return true; 
} 

//implement these functions 
OSStatus MouseHasDragged(EventHandlerCallRef inCaller, EventRef inEvent, void *pUserData){} 

EventTypeSpec需要更新/改變移動和休息應該是相同的。 這是一個碳碼。但是你也可以看看石英桌面服務。

乾杯!