2012-04-01 136 views
2

我試圖能夠檢測鼠標被按下而不是點擊。這就是我所擁有的,但我希望能夠檢測到鼠標被按下,而不是點擊次數。檢測鼠標被按下

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

回答

3

假設您想要檢測鼠標是否被按住一段時間。這很簡單,它只需要一個計時器。

在您的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

0

至於我記得當用戶第一次點擊的元素,而不是當按住鼠標按下僅觸發。

到您問題的解決方法是在你的.h定義BOOL像這樣:

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

然後:

mouseIsHeldDown = true; 

而在你的鼠標鬆開:

mouseIsHeldDown = false; 

然後,您可以檢查代碼中是否存在mouseIsHeldDown = true。

希望這可以解決您的問題!

9

與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:事件。