我目前正在将一个应用程序(或更确切地说,一个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。这真是一团糟。)
答案 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需要更新/更改以便移动和休息应该相同。 这是碳代码。但您也可以查看石英桌面服务。
干杯!