2012-10-25 85 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]; 
}