C#实现鼠标消息捕获

作者:.NET开发菜鸟 时间:2021-06-14 20:38:38 

在C#中怎样禁用鼠标按键,我们可以通过ImessageFilter接口下的PreFilterMessage方法、Application类的AddMessageFilter方法,RemoveMessageFilter方法和Message结构的Msg属性来禁用鼠标左键。Message结构包装Windows发送的消息,可使用该结构包装消息,并将其分配给窗口过程以进行调度,还可以使用该结构获取系统向应用程序或控件发送的关于某个消息的信息。

使用PreFilterMessage方法在调度消息之前将其筛选出来。语法格式如下: 

Bool PreFilterMessage(ref Message m)

参数说明:

  • m:要调度的消息,无法修改此消息。

  • 返回值:如果筛选消息并禁止消息被调度,则为True;如果允许消息继续到达下一个筛选器或控件,则为False。使用AddMessageFilter方法添加消息筛选器以便在向目标传送Windows消息时监视这些消息。使RemoveMessageFilter 从应用程序的消息泵移除一个消息筛选器。

示例一:在ComboBox选择值的时候,选择的值会随鼠标滚轮的滑动而改变,有时候不小心滑动了滑轮,导致选择的值改变,在下面的示例中,通过禁用鼠标滚轮,防止鼠标滚轮的滑动改变ComboBox选择的值。

界面:

C#实现鼠标消息捕获

代码实现:

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);
       }

}
}

示例二:窗体设置右键控件,演示禁用和解除禁用右键功能,右键菜单只有复制、剪切、粘贴三项

界面:

C#实现鼠标消息捕获

代码:

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

来源:https://www.cnblogs.com/dotnet261010/p/6691332.html

标签:C#,捕获,鼠标,消息
0
投稿

猜你喜欢

  • Android Notification使用方法详解

    2023-12-14 13:03:17
  • 基于Android中实现定时器的3种解决方法

    2022-02-10 15:03:53
  • Java日常练习题,每天进步一点点(42)

    2022-10-28 01:42:54
  • Spring Boot配置接口WebMvcConfigurer的实现

    2023-11-27 23:28:50
  • 详解Java之冒泡排序与选择排序

    2021-11-06 12:49:24
  • IKAnalyzer结合Lucene实现中文分词(示例讲解)

    2022-10-13 03:24:44
  • Android仿微信键盘切换效果

    2022-05-01 08:06:41
  • Ubuntu中为Android简单介绍硬件抽象层(HAL)

    2022-10-27 21:12:45
  • Android中Fab(FloatingActionButton)实现上下滑动的渐变效果

    2021-08-04 11:52:02
  • 编写android拨打电话apk应用实例代码

    2021-08-25 11:09:12
  • spring mvc利用ajax向controller传递对象的方法示例

    2022-10-22 15:06:13
  • springboot调用支付宝第三方接口(沙箱环境)

    2023-11-25 06:12:08
  • C#值类型、引用类型、泛型、集合、调用函数的表达式树实践

    2022-03-09 20:55:27
  • java实现学籍管理系统

    2023-04-03 00:32:19
  • Java泛型的简单实例

    2023-11-27 01:03:38
  • Android实现跑马灯效果的方法

    2021-09-06 13:56:38
  • mybatis 通过拦截器打印完整的sql语句以及执行结果操作

    2023-07-06 04:26:42
  • 详解BadTokenException报错解决方法

    2021-11-27 06:18:20
  • java微信公众号支付示例详解

    2023-11-15 05:52:01
  • Java最长公共子序列示例源码

    2023-08-20 13:25:37
  • asp之家 软件编程 m.aspxhome.com