检测鼠标被按下

问题描述:

我试图能够检测鼠标被按下而不是点击。这就是我所拥有的,但我希望能够检测到鼠标被按下,而不是点击次数。检测鼠标被按下

-(void)mouseDown:(NSEvent *)event; 
{ 
    //instead of clickCount I want my if statement to be 
    // if the mouse is being held down. 
    if ([event clickCount] < 1) 
    { 

    } 
    else if ([event clickCount] > 1) 
    { 

    } 
} 
+0

当用户点击并保存时,此事件不会触发吗? – millimoose 2012-04-01 18:43:04

+0

在发生'mouseDown'事件时,计算机在将来看不到足够远的位置,以判断用户是否要*继续按住鼠标按钮。通常,为了实现拖放操作,您只需计算出在mouseDown事件上拖动的内容,就可以观看像Kristian轮廓那样的mouseUp事件,并找出该项目被放置的位置,并处理mouseMoved '(或者其他所谓的)事件(它检查'mouseIsHeldDown')来查看是否有东西被拖动。 – 2012-04-01 20:28:08

+0

另一种选择是在'mouseDown'中设置某种延迟回调。如果鼠标被释放,你清除回调,如果回调触发,那么鼠标按钮至少持续了这段时间。这与密钥重复的工作方式类似。 – 2012-04-01 20:30:17

假设您想要检测鼠标是否被按住一段时间。这很简单,它只需要一个计时器。

在您的mouseDown:中,您启动了一个计时器,该计时器将在您选择的时间段后触发。你需要坚持到伊娃这一点,因为你也提到它在mouseUp:

- (void)mouseDown: (NSEvent *)theEvent { 
    mouseTimer = [NSTimer scheduledTimerWithTimeInterval:mouseHeldDelay 
                target:self 
               selector:@selector(mouseWasHeld:) 
               userInfo:theEvent 
               repeats:NO]; 
} 

mouseUp:,破坏定时器:

- (void)mouseUp: (NSEvent *)theEvent { 
    [mouseTimer invalidate]; 
    mouseTimer = nil; 
} 

如果计时器火灾,那么你知道,鼠标按钮被按住您指定的时间内,你可以把你喜欢的任何行动:

- (void)mouseWasHeld: (NSTimer *)tim { 
    NSEvent * mouseDownEvent = [tim userInfo]; 
    mouseTimer = nil; 
    // etc. 
} 
+0

你的'mouseUp'处理程序还应该处理如果用户点击某些东西但没有按住按钮而发生的任何需要。另外,是否有保证在'mouseUp:'进入之后但在[mouseTimer invalidate]之前定时器不会触发;'是否被调用? – 2012-04-01 20:56:28

+0

@Mike:1)当然;我将其作为对OP的练习。 2)定时器和事件处理都是运行循环的排队输入,所以这不应该成为问题。否则我想不出有什么办法可以做出这样的保证。 – 2012-04-01 21:01:54

+0

一旦我将鼠标按下一段时间并调用mouseWasHeld,即可获得EXC_BAD_ACCESS。只要我释放鼠标,但只有在调用mouseWasHeld时才会发生。你知道我做错了什么吗? – 2012-04-08 22:50:35

至于我记得当用户第一次点击的元素,而不是当按住鼠标按下仅触发。

到您问题的解决方法是在你的.h定义BOOL像这样:

bool mouseIsHeldDown = false; 
在你的鼠标按下

然后:

mouseIsHeldDown = true; 

而在你的鼠标松开:

mouseIsHeldDown = false; 

然后,您可以检查代码中是否存在mouseIsHeldDown = true。

希望这可以解决您的问题!

与OS X 10.6起,你可以使用NSEvent的从任何地方pressedMouseButtons方法:

NSUInteger mouseButtonMask = [NSEvent pressedMouseButtons]; 
BOOL leftMouseButtonDown = (mouseButtonMask & (1 << 0)) != 0; 
BOOL rightMouseButtonDown = (mouseButtonMask & (1 << 1)) != 0; 

该方法返回鼠标按钮的索引目前下来作为掩模。 1 << 0对应鼠标左键,1 << 1鼠标右键,1 << n,对于其他鼠标按钮n> = 2。

有了这个,没有必要赶上mouseDown:,mouseDragged:mouseUp:事件。