コントロールでキーストロークをトラップ方法として、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:
コメントを投稿