首頁 > 軟體

C#實現滑鼠訊息捕獲

2022-02-26 13:00:25

在C#中怎樣禁用滑鼠按鍵,我們可以通過ImessageFilter介面下的PreFilterMessage方法、Application類的AddMessageFilter方法,RemoveMessageFilter方法和Message結構的Msg屬性來禁用滑鼠左鍵。Message結構包裝Windows傳送的訊息,可使用該結構包裝訊息,並將其分配給視窗過程以進行排程,還可以使用該結構獲取系統嚮應用程式或控制元件傳送的關於某個訊息的資訊。

使用PreFilterMessage方法在排程訊息之前將其篩選出來。語法格式如下: 

Bool PreFilterMessage(ref Message m)

引數說明:

  • m:要排程的訊息,無法修改此訊息。
  • 返回值:如果篩選訊息並禁止訊息被排程,則為True;如果允許訊息繼續到達下一個篩選器或控制元件,則為False。使用AddMessageFilter方法新增訊息篩選器以便在向目標傳送Windows訊息時監視這些訊息。使RemoveMessageFilter 從應用程式的訊息泵移除一個訊息篩選器。

範例一:在ComboBox選擇值的時候,選擇的值會隨滑鼠滾輪的滑動而改變,有時候不小心滑動了滑輪,導致選擇的值改變,在下面的範例中,通過禁用滑鼠滾輪,防止滑鼠滾輪的滑動改變ComboBox選擇的值。

介面:

程式碼實現:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MouseDemo
{
    public partial class FrmMain : Form,IMessageFilter
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg == 522)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 表單載入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmMain_Load(object sender, EventArgs e)
        {
            InitComboBox();
        }

        /// <summary>
        /// 初始化ComboBox
        /// </summary>
        private void InitComboBox()
        {
            Dictionary<int, string> dictGrade = new Dictionary<int, string>();
            dictGrade.Add(1, "一年級");
            dictGrade.Add(2, "二年級");
            dictGrade.Add(3, "三年級");
            dictGrade.Add(4, "四年級");
            dictGrade.Add(5, "五年級");
            dictGrade.Add(6, "六年級");

            BindingSource dataSource = new BindingSource();
            dataSource.DataSource = dictGrade;
            cmb_Grade.DataSource = dataSource;
            cmb_Grade.DisplayMember = "Value";
            cmb_Grade.ValueMember = "Key";
        }

        /// <summary>
        /// 索引改變事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cmb_Grade_SelectedIndexChanged(object sender, EventArgs e)
        {
              //新增訊息過濾
            Application.AddMessageFilter(this);
        }


    }
}

範例二:表單設定右鍵控制元件,演示禁用和解除禁用右鍵功能,右鍵選單隻有複製、剪下、貼上三項

介面:

程式碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MouseRightDemo
{
    public partial class FrmMouseRight : Form   ,IMessageFilter
    {
        public FrmMouseRight()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 實現方法
        /// </summary>
        /// <param name="m"></param>
        /// <returns></returns>
        public bool PreFilterMessage(ref Message m)
        {
            //不響應滑鼠右鍵
            if (m.Msg >= 516 && m.Msg <= 517)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 禁用滑鼠右鍵
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
               //新增訊息
            Application.AddMessageFilter(this);
            MessageBox.Show("滑鼠右鍵已被禁止使用", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        /// <summary>
        /// 解決禁用滑鼠右鍵
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
                //移除訊息
            Application.RemoveMessageFilter(this);
            MessageBox.Show("滑鼠右鍵已被解除禁止使用,可以使用滑鼠右鍵", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}

滑鼠動作常見引數:

滑鼠移動:512

滑鼠左鍵:

down:513 up:514

double click:515

滑鼠右鍵:

down:516 up:517

滑鼠滾輪:522

到此這篇關於C#實現滑鼠訊息捕獲的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com