首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 使用 Windows 訊息機制提升開發效率

     編輯:關於C#

Windows 訊息基礎

Windows 以訊息驅動模型運作,所有 UI 互動 (點擊、鍵盤、繪圖) 皆透過訊息傳遞。C# 可透過 P/Invoke 呼叫 SendMessage 發送訊息,並重寫 DefWndProc 接收處理。

核心實作步驟

1. 定義訊息常數

public const int WM_LBUTTONDOWN = 0x0201;
public const int WM_USER = 0x0400; // 自訂訊息基底
public const int MY_CUSTOM_MSG = WM_USER + 1;

2. 發送訊息 (P/Invoke)

[DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

3. 接收處理訊息

protected override void DefWndProc(ref Message m)
{
    switch (m.Msg)
    {
        case WM_LBUTTONDOWN:
            MessageBox.Show($"滑鼠左鍵: wParam={m.WParam}, lParam={m.LParam}");
            break;
        case MY_CUSTOM_MSG:
            // 處理自訂訊息
            break;
        default:
            base.DefWndProc(ref m); // 交由基類處理
            break;
    }
}

進階:IMessageFilter 攔截訊息

實作 IMessageFilter 可在訊息分派前全域攔截 (類似 MFC 子類化):

public class MyForm : Form, IMessageFilter
{
    const int WM_MOUSEMOVE = 0x0200;

    public MyForm()
    {
        Application.AddMessageFilter(this); // 註冊
    }

    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == WM_MOUSEMOVE)
        {
            // 攔截滑鼠移動,回傳 true 表示已處理,不再分派
            return true;
        }
        return false;
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing) Application.RemoveMessageFilter(this);
        base.Dispose(disposing);
    }
}

應用場景

  • 跨視窗/進程通訊 (搭配 PostMessage 非同步)
  • 攔截/抑制特定控制項行為 (如禁用 DataGridView 某欄位編輯)
  • 整合非 .NET 元件 (ActiveX、C++ DLL 回呼)
  • 實作全域熱鍵、滑鼠手勢

注意事項

  • SendMessage 同步阻塞,PostMessage 非同步佇列。
  • 訊息參數 wParam/lParam 在 64 位系統為 IntPtr,需正確封送。
  • 濫用訊息機制會增加複雜度,優先考慮 .NET 事件/委派模型。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved