在可可中有一個可覆蓋的keyDown和keyUp函數,但沒有keyHeld?它是否有一個函數,或者有沒有辦法在Win32中檢查keystate?可可檢測鍵按下
這可能是一個愚蠢的問題,但我的經驗有限,我來自Win32背景。
感謝您的時間
在可可中有一個可覆蓋的keyDown和keyUp函數,但沒有keyHeld?它是否有一個函數,或者有沒有辦法在Win32中檢查keystate?可可檢測鍵按下
這可能是一個愚蠢的問題,但我的經驗有限,我來自Win32背景。
感謝您的時間
我不知道什麼keyHeld做win32上,但是當鍵被按下重複可可KeyDown事件。重複之前的速率和延遲取決於用戶設置(您可以使用和+keyRepeatDelay
方法在NSEvent
上獲取當前值)。如果該事件是第一個keyDown,或者該事件的isARepeat
屬性重複,則可以捕獲該事件。
我不相信有一種方法來檢查Cocoa中的關鍵狀態。如果你絕對需要它,也許你會有更低級別的API的運氣。如果你只需要幾個鍵,你可以在keyDown上設置一個標誌並在keyUp上重置它。
您可以爲此使用計時器。當你得到一個按鍵事件時,創建一個定時器,其定義的時間間隔爲你定義了「按住」,如果你獲得了同一個按鍵的按鍵事件,則銷燬它。如果定時器發生火災,那麼在指定的時間內按住按鍵。
事情大致是這樣的:
- (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];
}