3

我目前正在将一个应用程序(或者更准确地说,一个 VST 插件)从 Windows 移植到 OSX。我对 OSX 编程有点陌生,但我正在使用 HICocoaCreateView 添加到 Carbon 窗口(我从主机获得)的 Cocoa NSView。

Anywhoo ...在此视图中,我想获取 mouseMoved 和 mouseDragged 事件,但是在拖动时,即使鼠标离开我的 NSView(以及父窗口),我也想获取这些事件,但我似乎无法做到这发生了。

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

这快把我逼疯了!

更新:

还有一个叫做 CGEventTapCreate 的东西,据我从稀缺的文档中可以看出,它类似于 addGlobalMonitor... 但在 Carbon 中。我还没有完全了解 Carbon 和 Cocoa 是如何相互关联的,以及在哪里起作用。即使我的主要东西是可可,它也可以使用吗?(我从宿主那里得到的窗口可以是Cocoa和Carbon,真的是一团糟。)

4

2 回答 2

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...只是CGEventTaps 周围的 Obj-C 包装器。

我认为aCGEventTap是要走的路。他们的文档很少,是的,但它们很简单。Dave DeLong 对这个 SO question的回答可能会让您走上正确的道路。

于 2011-06-13T18:48:39.907 回答
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 需要更新/更改以进行移动和休息应该相同。这是一个碳代码。但你也可以看看石英桌面服务。

干杯!

于 2011-06-13T17:26:29.427 回答