可可检测键被按下

时间:2012-10-25 16:44:12

标签: objective-c cocoa events

在Cocoa中,keyDown和keyUp有一个可覆盖的函数但没有keyHeld?它有功能还是有办法在Win32中检查密钥状态?

这可能是一个愚蠢的问题,但我的经验有限,我来自Win32背景。

感谢您的时间

2 个答案:

答案 0 :(得分:2)

我不确定keyHeld在win32上做了什么,但是当按下键时,在Cocoa中重复keyDown事件。重复之前的速率和延迟取决于用户设置(您可以使用+keyRepeatInterval上的+keyRepeatDelayNSEvent方法获取当前值。如果事件是第一个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];
}