在可可中有一个可覆盖的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];
}