ProcessCmdKeyでトラップされる順番 - C#

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

Recent Posts