コントロールでキーストロークをトラップ方法として、ProcessCmdKeyをオーバーライドする方法が紹介されていますが、フォームとそのフォームに置かれているコントロールではどちらが先にキーストロークをトラップするのか。
結論から言えばフォームに配置されたコントロールが先にトラップします。
当たり前ですが、フォーカスを取得できるコントロールのみがトラップ可能です。
KeyDownイベントよりも先に発生します。
戻り値にtrueを返すことでKeyDownイベントでトラップされなくなります。
また、それより上階層のコントロール(フォームなど)にもトラップされなくなります。
using System.Windows.Forms; using System.Text; namespace ShortCutKey_Capture_Sample { class xTextBox : TextBox { private bool fastFlag; public xTextBox() { fastFlag = false; this.KeyDown +=new KeyEventHandler(xTextBox_KeyDown); } void xTextBox_KeyDown(object sender, KeyEventArgs e) { ShowFaster("KeyDown", e.KeyData); } protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { const int WM_KEYDOWN = 0x100; const int WM_SYSKEYDOWN = 0x104; if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN)) { ShowFaster("ProcessCmdKey", keyData); } return base.ProcessCmdKey(ref msg, keyData); } void ShowFaster(string methodName, Keys keyData) { switch (keyData) { case Keys.Control | Keys.N: if (fastFlag) { fastFlag = false; } else { fastFlag = true; this.Text = methodName + " Captured."; } break; } } } }
キーの組み合わせはこのような書き方で取得することができます。
switch (e.KeyData) { case Keys.Control | Keys.N: this.Text = "KeyDown <CTRL> + n Captured"; break; case Keys.Shift | Keys.N: this.Text = "<SHIFT> + n Captured"; break; case Keys.Alt | Keys.N: this.Text = "<ALT> + n Captured"; break; case Keys.Alt | Keys.Control | Keys.N: this.Text = "<ALT> + <CTRL> + n Captured"; break; }
0 Comments:
コメントを投稿