检测按住鼠标

时间:2012-04-01 18:38:21

标签: objective-c cocoa event-handling

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

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

    }
}

3 个答案:

答案 0 :(得分:9)

从OS X 10.6开始,您可以随时随地使用NSEvent的{​​{1}}方法:

pressedMouseButtons

该方法返回当前向下的鼠标按钮的索引作为掩码。 NSUInteger mouseButtonMask = [NSEvent pressedMouseButtons]; BOOL leftMouseButtonDown = (mouseButtonMask & (1 << 0)) != 0; BOOL rightMouseButtonDown = (mouseButtonMask & (1 << 1)) != 0; 对应于鼠标左键,1 << 0对应鼠标右键,1 << 1,n&gt; = 2对应其他鼠标按钮。

有了这个,就没有必要抓住1 << nmouseDown:mouseDragged:事件。

答案 1 :(得分:4)

据推测,您想要检测鼠标是否被按下一段时间。这非常简单;它只需要一个计时器。

mouseDown:中,您启动一​​个计时器,该计时器将在您选择的时间段后启动。您需要将其粘贴到ivar中,因为您还会在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.
}

答案 2 :(得分:0)

据我记得,mouseDown只在用户第一次点击元素时触发,而不是在按下时触发。

您的问题的解决方案是在.h中定义一个BOOL,如下所示:

bool mouseIsHeldDown = false;

然后在你的mouseDown中:

mouseIsHeldDown = true;

在你的mouseUP中:

mouseIsHeldDown = false;

然后,您可以在代码中的任何位置检查mouseIsHeldDown = true。

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