winform 煩人的鍵盤事件 再遇上 chart 上下左右 失靈
AI 用多了會失去思考耐心
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; namespace TestForm { public partial class UserControl2 : UserControl { public UserControl2() { InitializeComponent(); // 啟用 UserControl 自身的鍵盤事件 this.SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick | ControlStyles.UserMouse, true); this.SetStyle(ControlStyles.Selectable, true); this.TabStop = true; Chart ct = new Chart(); ct.PreviewKeyDown += OnPreviewKeyDown; this.Controls.Add(ct); // 訂閱 UserControl 自身的事件 this.KeyDown += ChildControl_KeyDown; this.KeyUp += ChildControl_KeyUp; this.PreviewKeyDown += OnPreviewKeyDown; // 為所有現有控件訂閱事件 SubscribeToChildControls(this); // 為新添加的控件訂閱事件 this.ControlAdded += (s, e) => SubscribeToControl(e.Control); } private void OnPreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { switch (e.KeyCode) { case Keys.Up: case Keys.Down: case Keys.Left: case Keys.Right: case Keys.Space: e.IsInputKey = true; break; } } private void SubscribeToChildControls(Control parent) { foreach (Control control in parent.Controls) { SubscribeToControl(control); SubscribeToChildControls(control); // 遞歸訂閱子控件 } } private void SubscribeToControl(Control control) { control.KeyDown += ChildControl_KeyDown; control.KeyUp += ChildControl_KeyUp; control.PreviewKeyDown += OnPreviewKeyDown; } private void ChildControl_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { // 將空格鍵標記為輸入鍵,這樣KeyUp事件才會觸發 if (e.KeyCode == Keys.Space) { e.IsInputKey = true; } } private void ChildControl_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Space) { Console.WriteLine("空格鍵按下 - 時間: " + DateTime.Now.ToString("HH:mm:ss.fff")); e.Handled = true; // 阻止默認處理 } if (e.KeyCode == Keys.Up) { Console.WriteLine("上鍵按下 - 時間: " + DateTime.Now.ToString("HH:mm:ss.fff")); e.Handled = true; // 阻止默認處理 } if (e.KeyCode == Keys.Down) { Console.WriteLine("下鍵按下 - 時間: " + DateTime.Now.ToString("HH:mm:ss.fff")); e.Handled = true; // 阻止默認處理 } if (e.KeyCode == Keys.Left) { Console.WriteLine("左鍵按下 - 時間: " + DateTime.Now.ToString("HH:mm:ss.fff")); e.Handled = true; // 阻止默認處理 } if (e.KeyCode == Keys.Right) { Console.WriteLine("右鍵按下 - 時間: " + DateTime.Now.ToString("HH:mm:ss.fff")); e.Handled = true; // 阻止默認處理 } if (e.KeyCode == Keys.Enter) { Console.WriteLine("回車鍵按下 - 時間: " + DateTime.Now.ToString("HH:mm:ss.fff")); e.Handled = true; // 阻止默認處理 } } private void ChildControl_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Space) { Console.WriteLine("空格鍵釋放 - 時間: " + DateTime.Now.ToString("HH:mm:ss.fff")); e.Handled = true; // 阻止默認處理 } } } }

浙公網安備 33010602011771號