Cocoa - 如何在鼠标未拖动时获取鼠标按下事件?

时间:2010-07-05 03:02:37

标签: cocoa event-handling mouse

Cocoa,Mac OS X 10.6。

我的应用程序(游戏)需要反复确定鼠标是否在视图中停止,即使鼠标位置没有改变。

问题:

    只有在第一次按下并按住鼠标时才会调用
  • mouseDown。如果此时鼠标移动,则不会调用mouseDragged,也不会再生成mouseDown个事件。

问题:在初始(仅限)mouseDown事件后,如何确定鼠标仍然处于停机状态?

感谢。

3 个答案:

答案 0 :(得分:0)

如果您需要在鼠标停止时定期执行某些操作,请mouseDown:创建重复timer,然后mouseUp:将其删除。

答案 1 :(得分:0)

如果您只是想知道鼠标是否已关闭,请在BOOLmouseDown:中设置mouseUp:变量。

如果您想在鼠标停止时继续做某事,可以按照此处的说明进入鼠标跟踪循环:The Mouse-Tracking Loop Approach基本上你循环直到找到鼠标按下事件,你可以做任何你想做的事情在循环。您必须使用nextEventMatchingMask:untilDate:inMode:dequeue:代替nextEventMatchingMask:,并将untilDate设置为简短。

答案 2 :(得分:0)

CGEventSourceButtonState(kCGEventSourceStateCombinedSessionState,kCGMouseButtonLeft));

就是你在64位上所追求的。 (确定晚了4年)。

// mozzilla ......

     1.30  #ifdef XP_MACOSX
     1.31 -  // hacky OS call to ensure that we don't show a context menu when the user
     1.32 -  // let go of the mouse already, after a long, cpu-hogging operation prevented
     1.33 +  // Hack to ensure that we don't show a context menu when the user
     1.34 +  // let go of the mouse after a long cpu-hogging operation prevented
     1.35    // us from handling any OS events. See bug 117589.
     1.36 -  if (!::StillDown())
     1.37 +  if (!CGEventSourceButtonState(kCGEventSourceStateCombinedSessionState, kCGMouseButtonLeft))
    1.38      return;
    1.39  #endif