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

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

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

这让我发疯!

更新:

还有一个叫做CGEventTapCreate的东西,据我从稀缺的文档中得知,它类似于addGlobalMonitor ...,但是在Carbon中。我还没有完全了解碳和可可彼此之间的关系以及在哪里工作的原理。即使我的主要原料是可可粉,它也可以使用吗? (我从主持人那里得到的窗口可以是可可和碳。这真是一团糟。)

最佳答案

CGEventTap并不是真正的Carbon。它位于Quartz中,可以视为Cocoa的子框架(实际上,它实际上只是其他框架的集合)。 Carbon是一个遗留的(已弃用的)框架,旨在简化Mac OS 9和Mac OS X之间的过渡,在Mac OS 9中,应用程序编程主要是用C进行的;在Mac OS X中,Objective-C被使用。苹果提供的并非所有C函数都是Carbon。作为使用C的现代框架,Quartz和Grand Central Dispatch立刻浮现在脑海(我相信会带来轻微的速度优势)。

弄清了背景之后,这些功能就可以与Cocoa代码一起正常工作了。据我所知,addGlobalEventMonitor...addLocalEventMonitor...只是CGEventTap周围的Obj-C包装。

我认为CGEventTap是必经之路。是的,他们的文档很少,是的,但是很简单。戴夫·德隆(Dave DeLong)对this SO question的回答可能会让您走上正确的道路。

10-01 13:38
查看更多