在 Windows Forms 應用程式中,使用者透過滑鼠與鍵盤進行互動是最基本的操作方式。掌握如何在 C# 中正確處理這些輸入事件,不僅能建立更直觀的使用者介面,也是開發遊戲、繪圖工具或互動式應用的基礎。本文將系統性地介紹滑鼠與鍵盤相關事件的註冊方式、事件參數運用,以及常見的實務處理技巧。
本文範例基於現代 .NET 環境(.NET 6/7/8 或 .NET Framework 4.7.2+)撰寫,概念適用於所有版本的 C# Windows Forms 開發。
Control 類別提供六個核心滑鼠事件,依觸發時機分類如下:
前三個事件(Enter/Leave/Hover)使用 EventHandler 委派,參數為 EventArgs;後三個事件(Move/Down/Up)使用 MouseEventHandler 委派,參數為 MouseEventArgs,提供豐富的滑鼠狀態資訊。
現代 C# 建議使用簡潔的 Lambda 表達式或方法群組註冊事件:
// 滑鼠進入/離開/懸停事件
button1.MouseEnter += (sender, e) => { /* 處理邏輯 */ };
button1.MouseLeave += Button1_MouseLeave;
// 滑鼠移動/按下/釋放事件
button1.MouseMove += Button1_MouseMove;
button1.MouseDown += Button1_MouseDown;
button1.MouseUp += Button1_MouseUp;
// 簡易事件處理器
private void Button1_MouseLeave(object sender, EventArgs e)
{
// 回應滑鼠離開邏輯
}
// 攜帶滑鼠座標與按鍵資訊的處理器
private void Button1_MouseMove(object sender, MouseEventArgs e)
{
int x = e.X; // 相對控制項左上角的 X 座標
int y = e.Y; // 相對控制項左上角的 Y 座標
MouseButtons btn = e.Button; // 目前按下的按鍵
}
private void Button1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
MessageBox.Show("按下左鍵");
else if (e.Button == MouseButtons.Right)
MessageBox.Show("按下右鍵");
}
以下完整程式碼示範在表單上移動滑鼠時於標題列顯示座標,點擊時彈出按鍵資訊:
using System;
using System.Windows.Forms;
public class MouseDemoForm : Form
{
public MouseDemoForm()
{
this.Text = "C# 滑鼠事件示範";
this.MouseMove += Form_MouseMove;
this.MouseDown += Form_MouseDown;
}
private void Form_MouseMove(object sender, MouseEventArgs e)
{
this.Text = $"目前滑鼠位置:({e.X}, {e.Y})";
}
private void Form_MouseDown(object sender, MouseEventArgs e)
{
string msg = e.Button switch
{
MouseButtons.Left => "按下滑鼠左鍵!",
MouseButtons.Right => "按下滑鼠右鍵!",
MouseButtons.Middle => "按下滑鼠中鍵!",
_ => "按下其他鍵"
};
MessageBox.Show(msg);
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MouseDemoForm());
}
}

圖 01:滑鼠座標與按鍵偵測執行畫面
KeyDown/KeyUp 使用 KeyEventHandler,參數 KeyEventArgs 提供 KeyCode、Modifiers 等屬性;KeyPress 使用 KeyPressEventHandler,參數 KeyPressEventArgs 提供 KeyChar。
// 註冊事件
this.KeyUp += Form_KeyUp;
this.KeyPress += Form_KeyPress;
// 處理按鍵釋放(可偵測功能鍵)
private void Form_KeyUp(object sender, KeyEventArgs e)
{
MessageBox.Show($"您按下的鍵為:{e.KeyCode}", "按鍵資訊");
}
// 處理字元輸入(適合文字輸入驗證)
private void Form_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsDigit(e.KeyChar) && e.KeyChar != '\b')
e.Handled = true; // 僅允許數字與退格鍵
}
using System;
using System.Windows.Forms;
public class KeyboardDemoForm : Form
{
public KeyboardDemoForm()
{
this.Text = "C# 鍵盤事件示範";
this.KeyUp += Form_KeyUp;
}
private void Form_KeyUp(object sender, KeyEventArgs e)
{
MessageBox.Show(e.KeyCode.ToString(), "您所按下的鍵為:");
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new KeyboardDemoForm());
}
}

圖 02:鍵盤按鍵偵測執行畫面
設定表單 KeyPreview = true 可讓表單優先於子控制項接收鍵盤事件,方便實作全域熱鍵。
單擊流程:MouseDown → MouseClick → MouseUp。雙擊會觸發兩次單擊流程後接 MouseDoubleClick。
使用 PointToScreen/PointToClient 在螢幕座標與控制項座標間轉換。
C# 提供完整的事件模型處理滑鼠與鍵盤輸入。理解委派差異、善用事件參數屬性,並配合 KeyPreview 等屬性,即能建立靈活直觀的互動介面。實務上建議:
MouseMove 搭配 MouseEventArgs.X/YMouseDown 的 Button 屬性或 KeyUp 的 KeyCodeKeyPress 的 KeyCharKeyPreview這些基礎雖簡單,卻是所有進階互動開發的基石。