在winform中捕獲上下左右鍵等控制鍵的按鍵事件

衣舞晨風發表於2015-08-06
最近一直在做表單設計器,今天有一個需求就是:通過上下左右鍵來控制表單上的控制元件移動。
但是控制元件的KeyDown捕獲不到上下左右鍵,KeyUp事件倒是可以捕獲到,但你通過上下左右鍵移動控制元件位置,不能點一下才移動一下啊,太不人性了。上網找了半天發現了這麼一個方法:

重寫Control的ProcessDialogKey方法,此處以winform表單為例:

protected override bool ProcessDialogKey(Keys keyData)
        {
            Control control = this.GetFocusedControl();
            this.MoveControlByKeys(keyData, control);
            return base.ProcessDialogKey(keyData);
        }
        /// <summary>
        /// 根據keyData的值移動控制元件control
        /// </summary>
        /// <param name="keyData"></param>
        /// <param name="control"></param>
        private void MoveControlByKeys(Keys keyData, Control control)
        {
            if (keyData == Keys.Left)
            {
                if (control.Location.X > 0)
                {
                    control.Location = new Point(control.Location.X - 1, control.Location.Y);
                }
            }
            else if (keyData == Keys.Right)
            {
                control.Location = new Point(control.Location.X + 1, control.Location.Y);
            }
            else if (keyData == Keys.Up)
            {
                if (control.Location.Y > 0)
                {
                    control.Location = new Point(control.Location.X, control.Location.Y - 1);
                }
            }
            else if (keyData == Keys.Down)
            {
                control.Location = new Point(control.Location.X, control.Location.Y + 1);
            }
        }

        //API宣告:獲取當前焦點控制元件控制程式碼    
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
        internal static extern IntPtr GetFocus();
        ///獲取 當前擁有焦點的控制元件
        private Control GetFocusedControl()
        {
            Control focusedControl = null;
            // To get hold of the focused control:
            IntPtr focusedHandle = GetFocus();
            if (focusedHandle != IntPtr.Zero)
                //focusedControl = Control.FromHandle(focusedHandle);
                focusedControl = Control.FromChildHandle(focusedHandle);
            return focusedControl;
        }
在表單設計器中這個方法不起作用,不清楚為什麼
於是還要尋找新的解決方案,但是發現了PreviewKeyDown事件,在表單設計器中,它可以獲取到上下左右鍵,問題解決。

關於PreviewKeyDown部分內容可以參考:點選開啟連結

相關文章