WndProc
?是操作系統與你的程序“對話”的通道??。當用戶點擊鼠標、按下鍵盤,或系統事件(如窗口移動)發生時,Windows 會將這些事件打包成“消息”,發送給你的窗口,而?WndProc
?就是接收和處理這些消息的函數。
WndProc
?接收四個參數,對應一條消息的全部信息:
protected override void WndProc(ref Message m) // C# 寫法
{// m.Msg -> 消息類型(例如:鼠標點擊、鍵盤按下)// m.WParam -> 附加信息1(例如:按了哪個鍵)// m.LParam -> 附加信息2(例如:鼠標點擊的坐標)// m.HWnd -> 接收消息的窗口句柄(窗口的身份證)
}
如何用?三步搞定?
? ??1. 重寫 WndProc 方法??
在 C# WinForm 窗體代碼中直接重寫:
public partial class MyForm : Form
{protected override void WndProc(ref Message m){// 你的處理邏輯寫在這里base.WndProc(ref m); // 其他消息交給系統處理}
}
? ??2. 識別并處理消息??
例如:??攔截關閉按鈕??,改為最小化窗口:
protected override void WndProc(ref Message m)
{const int WM_CLOSE = 0x0010;if (m.Msg == WM_CLOSE){this.WindowState = FormWindowState.Minimized; // 不關閉,最小化return; // 不再傳遞消息}base.WndProc(ref m); // 其他消息正常處理
}
? ??3. 實現快捷鍵檢測??
例如:按下?Ctrl + S
?時自動保存:
protected override void WndProc(ref Message m)
{const int WM_HOTKEY = 0x0312;const int CTRL_S = 0x0001 + (int)Keys.S; // 組合鍵標識if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == CTRL_S){SaveFile(); // 執行保存return;}base.WndProc(ref m);
}