将mouseMoved / mouseDragged放在我的NSView窗口之外

时间:2011-06-13 12:39:31

标签: xcode cocoa macos macos-carbon vst

我目前正在将一个应用程序(或更确切地说,一个VST插件)从Windows移植到OSX。我是OSX编程的新手,但我正在使用HICocoaCreateView将Cocoa NSView添加到Carbon窗口(我从主机获取)。

Anywhoo ...在这个视图中我想得到mouseMoved& mouseDragged事件,但是当拖动时我也希望获得这些事件,即使鼠标离开我的NSView(以及父窗口),但我似乎无法实现这一点。

在Windows上我会在mouseDown上执行一个SetCapture来获取所有鼠标事件一段时间。我在Cocoa中找到的最接近的东西是“addGlobalMonitorForEventsMatchingMask”,但这只是10.6+而且我很难相信这是之前无法做到的事情。 (毕竟,这是常用于滚动条等可拖动组件的东西。)

这让我疯了!

更新

还有一种叫做CGEventTapCreate的东西,据我所知,从稀缺的文档来看,它类似于addGlobalMonitor ......但是在Carbon中。我还没有确切知道Carbon和Cocoa如何与彼此相关,以及在哪里工作。即使我的主要东西是可可,它也可用吗? (我从主人那里得到的窗口可以是Cocoa和Carbon。这真是一团糟。)

2 个答案:

答案 0 :(得分:3)

CGEventTap的东西实际上不是碳。它在Quartz中,可以被视为Cocoa的子框架(实际上它只是其他框架的集合)。 Carbon是一个遗留(并且已弃用)的框架,旨在简化Mac OS 9(其中应用程序编程主要在C中完成)和Mac OS X(使用Objective-C)之间的过渡。并非每个Apple提供的C功能都是Carbon; Quartz和Grand Central Dispatch立即成为使用C的现代框架(我相信具有轻微的速度优势)。

在完成背景后,这些函数可以正常使用Cocoa代码。据我所知,addGlobalEventMonitor...addLocalEventMonitor...只是围绕CGEventTap s的Obj-C包装。

我认为CGEventTap是可行的方法。他们的文档很少,是的,但它们很简单。 Dave DeLong对this SO question的回答可能会让你走上正确的道路。

答案 1 :(得分:2)

我想你需要做这样的事......

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需要更新/更改以便移动和休息应该相同。 这是碳代码。但您也可以查看石英桌面服务。

干杯!