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

C# 應用程式層級滑鼠訊息過濾:禁用特定控件或整個視窗的滑鼠輸入

     編輯:關於C語言

需求

禁止滑鼠作用於特定控件 (如 ListBox) 或整個視窗,僅保留鍵盤關閉功能。

實作 IMessageFilter


public class MouseMessageFilter : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        // 0x100 = WM_KEYDOWN, 0x11 = VK_CONTROL (示例)
        // 實際滑鼠訊息: 0x200=WM_MOUSEMOVE, 0x201=WM_LBUTTONDOWN, 0x202=WM_LBUTTONUP, 0x203=WM_LBUTTONDBLCLK
        // 0x204=WM_RBUTTONDOWN, 0x205=WM_RBUTTONUP, 0x206=WM_RBUTTONDBLCLK
        if (m.Msg >= 0x200 && m.Msg <= 0x206) // 攔截所有滑鼠訊息
        {
            return true; // true = 過濾掉(不再分派)
        }
        return false;
    }
}

註冊與移除


[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    var filter = new MouseMessageFilter();
    Application.AddMessageFilter(filter); // 註冊
    Application.Run(new Form1());
    Application.RemoveMessageFilter(filter); // 移除
}

進階控制

  • 在 PreFilterMessage 中判斷 m.HWnd 針對特定控件過濾。
  • 結合 Control.FromHandle 取得控件實例進一步判斷邏輯。
  • 僅攔截特定訊息 (如 WM_LBUTTONDOWN) 允許滑鼠移動但禁止點擊。

應用層級訊息過濾器提供全域攔截能力,比控件層級事件處理更徹底。

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