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

C# WinForm 訊息攔截兩大技巧:重寫 DefWndProc 處理特定訊息、實作 IMessageFilter 全域訊息過濾器

     編輯:關於C語言

方法一:重寫 DefWndProc


protected override void DefWndProc(ref Message m)
{
    if (m.Msg == 0x0201) // WM_LBUTTONDOWN
        MessageBox.Show(m.Msg.ToString());
    else
        base.DefWndProc(ref m);
}

方法二:實作 IMessageFilter


public class MessageFilter : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == 0x0201)
        {
            MessageBox.Show("WM_LBUTTONDOWN is: " + m.Msg);
            return true; // 過濾掉,不再分派
        }
        return false;
    }
}

// 註冊
private static MessageFilter msgFilter = new MessageFilter();
[STAThread]
static void Main()
{
    Application.AddMessageFilter(msgFilter);
    Application.Run(new Form1());
}

// 移除註冊
Application.RemoveMessageFilter(msgFilter);

常用 Windows 訊息 ID 常數

建議保存 WM_LBUTTONDOWN=0x0201、WM_RBUTTONDOWN=0x0204、WM_KEYDOWN=0x0100 等常用值供查閱。

差異:DefWndProc 僅影響該表單;IMessageFilter 影響整個應用程式訊息迴圈。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved