Cocoa には keyDown と keyUp のオーバーライド可能な関数がありますが、keyHeld はありませんか? 機能がありますか、または Win32 のようにキーステートを確認する方法はありますか?
これはばかげた質問かもしれませんが、私の限られた経験と私は Win32 のバックグラウンドを持っています。
御時間ありがとうございます
Cocoa には keyDown と keyUp のオーバーライド可能な関数がありますが、keyHeld はありませんか? 機能がありますか、または Win32 のようにキーステートを確認する方法はありますか?
これはばかげた質問かもしれませんが、私の限られた経験と私は Win32 のバックグラウンドを持っています。
御時間ありがとうございます
win32 で keyHeld が何をするのかはわかりませんが、Cocoa ではキーを押し続けると keyDown イベントが繰り返されます。+keyRepeatInterval
繰り返されるまでのレートと遅延は、ユーザー設定によって異なります (現在の値はと+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];
}