2012-10-25 175 views
1

在可可中有一個可覆蓋的keyDown和keyUp函數,但沒有keyHeld?它是否有一個函數,或者有沒有辦法在Win32中檢查keystate?可可檢測鍵按下

這可能是一個愚蠢的問題,但我的經驗有限,我來自Win32背景。

感謝您的時間

回答

2

我不知道什麼keyHeld做win32上,但是當鍵被按下重複可可KeyDown事件。重複之前的速率和延遲取決於用戶設置(您可以使用和+keyRepeatDelay方法在NSEvent上獲取當前值)。如果該事件是第一個keyDown,或者該事件的isARepeat屬性重複,則可以捕獲該事件。

我不相信有一種方法來檢查Cocoa中的關鍵狀態。如果你絕對需要它,也許你會有更低級別的API的運氣。如果你只需要幾個鍵,你可以在keyDown上設置一個標誌並在keyUp上重置它。

0

您可以爲此使用計時器。當你得到一個按鍵事件時,創建一個定時器,其定義的時間間隔爲你定義了「按住」,如果你獲得了同一個按鍵的按鍵事件,則銷燬它。如果定時器發生火災,那麼在指定的時間內按住按鍵。

事情大致是這樣的:

- (void)keyDown: (NSEvent *)event 
{ 
    NSTimer * tim = [NSTimer scheduledTimerWithTimeInterval:kKeyHeldInterval 
                target:self 
                selector:@selector(keyHeld:) 
                userInfo:event 
                repeats:NO]; 

    NSNumber * keyCodeNum = [NSNumber numberWithUnsignedShort:[event keyCode]]; 
    [[self dictionaryOfKeyHeldTimers] setObject:tim forKey:keyCodeNum]; 
} 

- (void)keyUp: (NSEvent *)event 
{ 
    NSNumber * keyCodeNum = [NSNumber numberWithUnsignedShort:[event keyCode]]; 
    NSTimer * tim = [[self dictionaryOfKeyHeldTimers] popObjectForKey:keyCodeNum]; 

    [tim invalidate]; 
} 

- (void)keyHeld: (NSTimer *)tim 
{ 
    // Key was held, take action. 
    NSEvent * event = [tim userInfo]; 
    NSNumber * keyCodeNum = [NSNumber numberWithUnsignedShort:[event keyCode]]; 
    [[self dictionaryOfKeyHeldTimers] removeObjectForKey:keyCodeNum]; 
}