1

Cocoa には keyDown と keyUp のオーバーライド可能な関数がありますが、keyHeld はありませんか? 機能がありますか、または Win32 のようにキーステートを確認する方法はありますか?

これはばかげた質問かもしれませんが、私の限られた経験と私は Win32 のバックグラウンドを持っています。

御時間ありがとうございます

4

2 に答える 2

2

win32 で keyHeld が何をするのかはわかりませんが、Cocoa ではキーを押し続けると keyDown イベントが繰り返されます。+keyRepeatInterval繰り返されるまでのレートと遅延は、ユーザー設定によって異なります (現在の値はと+keyRepeatDelayメソッドで取得できますNSEvent)。イベントが最初の keyDown であるか、イベントのisARepeatプロパティで繰り返されるイベントであるかをキャッチできます。

Cocoa でキーステートを確認する方法があるとは思えません。絶対に必要な場合は、低レベルの API を使用した方がうまくいく可能性があります。いくつかのキーに対してのみ必要な場合は、おそらく keyDown でフラグを設定し、keyUp でフラグをリセットすることで解決できます。

于 2012-10-25T17:44:21.220 に答える
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];
}
于 2012-10-25T18:04:27.957 に答える