在移动OS X“Carbon”窗口时,可以使用哪个API来捕捉鼠标?

时间:2009-09-03 07:55:07

标签: macos mouse capture macos-carbon drag

根据要求,我已经实现了对移动OS X窗口的支持,方法是使用窗口内容部分内的区域拖动它,即复制标题栏的拖动和移动功能,但在另一个区域中。

我还没有解决的问题是,如果用户快速拖动鼠标,它可以离开窗口区域,然后不再接收鼠标移动事件。

在Windows上,可以通过调用win32方法SetCapture()来解决这类问题,对应的OSX方法是什么?

此应用程序是一个跨平台的C ++应用程序,使用Carbon作为OS X特定部分。 (是的,我知道所有关于Cocoa的好处,但这是一个较旧的代码库,此时Cocoa端口没有时间和金钱。)

我找到了Carbon API方法,比如TrackMouseLocation(),但是我无法真正看到如何将它们用于此应用程序。在这里列出2-7 http://developer.apple.com/legacy/mac/library/documentation/Carbon/Conceptual/Carbon_Event_Manager/Tasks/CarbonEventsTasks.html 捕获鼠标但问题是TrackMouseLocation()阻止等待输入。阻止是这个应用程序无法做到的事情,因为它还拥有一个必须每秒多次调用的flash播放器。

我试图解决这个原型的原型基本上是这样的:

switch(GetEventKind(inEvent))
{
  case kEventMouseDown:
    // A silly test to make parts of the window border "draggable"
    dragging = local_loc.v < 25 || local_loc.h < 25; 
    last_screen_loc = screen_loc;
    break;
  case kEventMouseUp:
    dragging = false;
    break;
  case kEventMouseMoved:
    break;
  case kEventMouseDragged:
    if (dragging) {
      Rect rect;
      GetWindowBounds (windowRef, kWindowContentRgn, &rect);
      int dx = screen_loc.h - last_screen_loc.h;
      int dy = screen_loc.v - last_screen_loc.v;
      rect.left += dx;
      rect.right += dx;
      rect.top += dy;
      rect.bottom += dy;
      SetWindowBounds (windowRef, kWindowContentRgn, &rect);
    }
    last_screen_loc = screen_loc;
    break;

任何想法都赞赏?

3 个答案:

答案 0 :(得分:1)

我觉得你应该在Window和窗外跟踪鼠标。以下代码可以解决您的问题,

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){}

希望它有所帮助!!

答案 1 :(得分:0)

我希望它也能帮到你:

   // Get Mouse Position --> WAY 1      
printf("Get Mouse Position Way 1\n");   

HICoordinateSpace space = 2;    

HIGetMousePosition(space, NULL, &point);    
printf("Mouse Position: %.2f %.2f \n", point.x, point.y);


// Get Mouse Position --> WAY 2 
printf("Get Mouse Position Way 2\n");

CGEventRef ourEvent = CGEventCreate(NULL);
point = CGEventGetLocation(ourEvent);
printf("Mouse Position: %.2f, y = %.2f \n", (float)point.x, (float)point.y);

我正在寻找在某个位置获取WindowPart参考的方法(在所有应用程序的所有窗口中)

Carbon中的某些方法不起作用,总是返回0作为windowRef ...有什么想法吗?

答案 2 :(得分:0)

您也可以尝试调用DragWindow来响应窗口内容区域中的点击。我认为你不需要自己实施拖动。