フォームでProcessCmdKeyをオーバーライドすることは、ボタンやメニュー項目に組み込まれているニーモニック処理を超えて、カスタムのショートカットキーストローク処理を実装できるようにすることを明示的に目的としています。
これは、フォーカスのあるコントロールがKeyDownイベントを取得する前に、どのクライアントコントロールがフォーカスを持っているかに関係なく、キーダウンイベントでのみ呼び出されます。したがって、KeyUpやKeyPressには関連付けられていません。ショートカット関数を実行した後、キーを認識すると、オーバーライドからtrueを返します。これにより、キーがそれ以上処理されなくなり、KeyDown / Press/Upイベントが生成されなくなります。
メソッドのmsg引数を使用することは非常にまれです。msg.Msg値はWM_KEYDOWNまたはWM_SYSKEYDOWNのみになり、後者のメッセージはユーザーがAltキーを押したときに生成されます。keyData引数からいつでも取得できるので気にしないでください。このような:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == (Keys.Alt | Keys.F)) {
// Alt+F pressed
doSomething();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
|で確認したい他の修飾子 ここで使用される演算子は、Keys.ShiftとKeys.Controlです。したがって、(Keys.Shift | Keys.Control | Keys.F1)はCtrl + Shift+F1をチェックします。繰り返しキーをチェックするなどの異常なことをしたい場合は、msgデータを解釈できます。WM_KEYDOWN通知については、MSDNドキュメントを確認してください。msg.LParam値には、キーストロークに関する一連の情報が含まれています。
このメソッドでは仮想キーのみを取得することに注意してください。Keys.Fは、英語のキーボードレイアウトのFキーですが、ユーザーのレイアウトの同じ場所にあるキーと同じ文字である必要はありません。ドキュメントの問題を回避するために、ファンクションキーを使用してください。
キーの繰り返しはキーボードコントローラーの機能であり、キーの入力に限定されません。矢印キーとファンクションキーは、押したままにすると確実に繰り返されます。このシナリオでは、KeyPressを無視します。ただし、タイピングキー(Keys.Fなど)でもあるキーにショートカットキーを割り当てる場合は、TextBoxのようなコントロールを壊さないように、常に修飾キーもチェックする必要があります。
最後になりましたが、ボタンとメニュー項目のコントロールに組み込まれているニーモニックのサポートを忘れないでください。のようにTextプロパティを&OK
作成すると、コードを必要とせずに自己文書化ショートカットが作成されます。この例では、Alt+Oと入力してユーザーが操作します。