C#捕获鼠标消息

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

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

Bool PreFilterMessage(ref Message m)

参数说明:

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

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

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

界面:

代码实现:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10
11 namespace MouseDemo
12 {
13     public partial class FrmMain : Form,IMessageFilter
14     {
15         public FrmMain()
16         {
17             InitializeComponent();
18         }
19
20         public bool PreFilterMessage(ref Message m)
21         {
22             if (m.Msg == 522)
23             {
24                 return true;
25             }
26             else
27             {
28                 return false;
29             }
30         }
31
32         /// <summary>
33         /// 窗体加载
34         /// </summary>
35         /// <param name="sender"></param>
36         /// <param name="e"></param>
37         private void FrmMain_Load(object sender, EventArgs e)
38         {
39             InitComboBox();
40         }
41
42         /// <summary>
43         /// 初始化ComboBox
44         /// </summary>
45         private void InitComboBox()
46         {
47             Dictionary<int, string> dictGrade = new Dictionary<int, string>();
48             dictGrade.Add(1, "一年级");
49             dictGrade.Add(2, "二年级");
50             dictGrade.Add(3, "三年级");
51             dictGrade.Add(4, "四年级");
52             dictGrade.Add(5, "五年级");
53             dictGrade.Add(6, "六年级");
54
55             BindingSource dataSource = new BindingSource();
56             dataSource.DataSource = dictGrade;
57             cmb_Grade.DataSource = dataSource;
58             cmb_Grade.DisplayMember = "Value";
59             cmb_Grade.ValueMember = "Key";
60         }
61
62         /// <summary>
63         /// 索引改变事件
64         /// </summary>
65         /// <param name="sender"></param>
66         /// <param name="e"></param>
67         private void cmb_Grade_SelectedIndexChanged(object sender, EventArgs e)
68         {
69               //添加消息过滤
70             Application.AddMessageFilter(this);
71         }
72
73
74     }
75 }

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

界面:

代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10
11 namespace MouseRightDemo
12 {
13     public partial class FrmMouseRight : Form   ,IMessageFilter
14     {
15         public FrmMouseRight()
16         {
17             InitializeComponent();
18         }
19
20         /// <summary>
21         /// 实现方法
22         /// </summary>
23         /// <param name="m"></param>
24         /// <returns></returns>
25         public bool PreFilterMessage(ref Message m)
26         {
27             //不响应鼠标右键
28             if (m.Msg >= 516 && m.Msg <= 517)
29             {
30                 return true;
31             }
32             else
33             {
34                 return false;
35             }
36         }
37
38         /// <summary>
39         /// 禁用鼠标右键
40         /// </summary>
41         /// <param name="sender"></param>
42         /// <param name="e"></param>
43         private void button1_Click(object sender, EventArgs e)
44         {
45                //添加消息
46             Application.AddMessageFilter(this);
47             MessageBox.Show("鼠标右键已被禁止使用", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
48         }
49
50         /// <summary>
51         /// 解决禁用鼠标右键
52         /// </summary>
53         /// <param name="sender"></param>
54         /// <param name="e"></param>
55         private void button2_Click(object sender, EventArgs e)
56         {
57                 //移除消息
58             Application.RemoveMessageFilter(this);
59             MessageBox.Show("鼠标右键已被解除禁止使用,可以使用鼠标右键", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
60         }
61     }
62 }

鼠标动作常见参数:

鼠标移动:512

鼠标左键:

down:513 up:514

double click:515

鼠标右键:

down:516 up:517

鼠标滚轮:522

时间: 2024-12-19 06:17:01

C#捕获鼠标消息的相关文章

C#通过IMessageFilter捕获鼠标消息(转载)

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

鼠标消息与键盘消息

在Microsoft Windows 中,键盘和鼠标是两个标准的用户输入源,在一些交叠的操作中通常相互补充使用.当然,鼠标在今天的应用程序中比10年前使用得更为广泛.甚至在一些应用程序中,我们更习惯于使用鼠标,例如在游戏.画图程序.音乐程序,以及Web创览器等程序中就是这样.然而,我们可以不使用鼠标,但绝对不能从一般的PC中拆掉键盘. 相对于个人计算机的其他组件,键盘有非常久远的历史,它起源于1874年的第一台Remington打字机.早期的计算机程序员用键盘在 Hollerith卡片上打孔,以

对话框捕获鼠标移动消息,实现“逃跑按钮”

在弹出的对话框上显示逃跑按钮,当鼠标移动到该按钮上时,该按钮隐藏,而在别的位置上显示一个一模一样的按钮,鼠标再次置于新按钮上时,该按钮再次隐藏而在另一位置显示,用户感觉按钮好像在自动逃跑移动: 1.新建一个基于对话框的MFC工程,将其资源窗口的对话框中的自带控件删除,在不同位置添加两个一模一样的按钮控件 2.此处需要让按钮来捕获鼠标移动的消息,但是该对话框中有两个一样的按钮,故需要创建一个派生于CButton类的新的类CNewButton,为两个按钮控件分别添加成员变量并与CNewButton类

没有躲过的坑--捕获窗口之外的鼠标消息(钩子还是??)

做一个发送表情的对话框,类似微信和QQ一样的,点击表情按钮,弹出表情框,鼠标点击表情框外时,这个表情框被kill. 说白了 就是在这个窗口上获得窗口外面的鼠标消息. Google百度了一番,很多人说道使用钩子,才能获得窗口外面的click事件,这也未免太小题大做了吧. 还好发现了一个简简单单的函数: SetCapture(*this); 函数功能:该函数在属于当前线程的指定窗口里设置鼠标捕获.一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内.同一时刻只能有一个窗口捕获鼠标

界面控件 - 滚动条ScrollBar(对滚动条消息和鼠标消息结合讲的不错)

界面是人机交互的门户,对产品至关重要.在界面开发中只有想不到没有做不到的,有好的想法,当然要尝试着做出来.对滚动条的扩展,现在有很多类是的例子. VS2015的代码编辑是非常强大的,其中有一个功能可以把滚动态变成MinMap,可以通过Options->Text Editor->C/C++->Scroll Bars中的Behavior选项分类进行打开. sublime也有这个功能,但没有VS的好用.变成MinMap后整个代码文档变成一个完整的缩微图,在你对代码比较熟悉的情况下,可以非常容易

第7章 鼠标_7.5-7.6 捕获鼠标和鼠标滚轮

7.5 捕获鼠标 (1)捕获鼠标:SetCapture(hwnd)——Windows将所有消息都发给hwnd窗口,鼠标消息总是以客户区消息的形式出现.即使鼠标位于非客户区也一样.lParam为客户区坐标. (2)释放捕获:ReleaseCapture() (3)一般WM_LBUTTONDOWN时开始捕获,WM_LBUTTONUP时停止捕获. [BlokOut程序] /*------------------------------------------------------------ BLO

第7章 鼠标_7.1-7.4 鼠标基础知识和鼠标消息

7.1 鼠标的基础知识 功能 GetSysMetrics的 参数 返回值 判断是否安装鼠标 SM_MOUSEPRESENT WINNT以上:TRUE己安装.0未安装 Windows98:总是TRUE. 鼠标按钮个数 SM_CMOUSEBUTTONS WINNT以上:0为未安装鼠标 Windows98:有安装鼠标返回按钮个数,没安装鼠标返回2. 鼠标按钮是否被切换 SM_SWAPBUTTON 设定鼠标其他参数(如双击):用SystemParametrsInfo函数获取或设定 (2)鼠标指针:wnd

MFC控件编程之鼠标消息

MFC控件编程之鼠标消息 在MFC中鼠标消息.键盘消息我们很常用.所以说一下. 鼠标消息分为客户区消息.跟非客户区消息. 一丶客户区消息 我们可以处理消息.来进行我们相应的函数即可. MFC添加消息的话.可以自己在消息映射表中添加 .可以自己使用工具直接添加. 消息映射表添加 学习过MFC原理的应该知道.这里可以添加消息. 自己可以手动添加.我们也可以使用向导来添加. void CCDCDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO

Hyper-V中 远程桌面无法捕获鼠标信号

当我们在Hyper-v中遇到鼠标不能正常使用,点击鼠标没反应的时候,在网络连接中也找不到网卡.点击鼠标时,虚拟机下方提示, "远程桌面无法捕获鼠标信号", 这是由于驱动问题导致的. 我们在虚拟机中插入集成服务安装盘,如下图, 手动运行光盘里的 support->x86 -> setup  重启客户机后,鼠标可以使用,网络连接也正常了. Hyper-V中 远程桌面无法捕获鼠标信号,布布扣,bubuko.com