在Cocoa中,keyDown和keyUp有一个可覆盖的函数但没有keyHeld?它有功能还是有办法在Win32中检查密钥状态?
这可能是一个愚蠢的问题,但我的经验有限,我来自Win32背景。
感谢您的时间
答案 0 :(得分:2)
我不确定keyHeld在win32上做了什么,但是当按下键时,在Cocoa中重复keyDown事件。重复之前的速率和延迟取决于用户设置(您可以使用+keyRepeatInterval
上的+keyRepeatDelay
和NSEvent
方法获取当前值。如果事件是第一个keyDown或重复的事件的isARepeat
属性,您可以捕获。
我不相信有办法检查Cocoa中的keystates。如果您绝对需要,也许您可以通过更低级别的API获得更多运气。如果您只需要几个键就可以在keyDown上设置一个标志并在keyUp上重置它。
答案 1 :(得分: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];
}