在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 == )
  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(, "一年级");
  49. dictGrade.Add(, "二年级");
  50. dictGrade.Add(, "三年级");
  51. dictGrade.Add(, "四年级");
  52. dictGrade.Add(, "五年级");
  53. dictGrade.Add(, "六年级");
  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. }

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

界面:

代码:

  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 >= && m.Msg <= )
  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

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

  1. 【笨嘴拙舌WINDOWS】键盘消息,鼠标消息

    键盘消息 Windows系统无论何时只有一个窗口(可能是子窗口,也就是控件)能获得焦点. 焦点窗口通过windows消息来响应人的键盘操作,与键盘相关的常用消息罗列如下: WM_KEYDOWN   按 ...

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

    界面是人机交互的门户,对产品至关重要.在界面开发中只有想不到没有做不到的,有好的想法,当然要尝试着做出来.对滚动条的扩展,现在有很多类是的例子. VS2015的代码编辑是非常强大的,其中有一个功能可以 ...

  3. 【C#】解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题

    原文:[C#]解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题 最近在debug鼠标位置捕获的功能时发现在其中的一台开发电脑上,SetWindowsHo ...

  4. OnClick事件的Sender参数的前世今生——TWinControl.WinProc优先捕捉到鼠标消息,然后使用IsControlMouseMsg函数进行消息转发给图形子控件(意外发现OnClick是由WM_LBUTTONUP触发的)

    这是一个再普通不过的Button1Click执行体: procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('I am B ...

  5. 深刻:截获windows的消息并分析实例(DefWindowProc),以WM_NCHITTEST举例(Windows下每一个鼠标消息都是由 WM_NCHITTEST 消息产生的,这个消息的参数包含了鼠标位置的信息)

    1,回调函数工作机制 回调函数由操作系统自动调用,回调函数的返回值当然也是返回给操作系统了. 2,截获操作系统发出的消息,截获到后,将另外一个消息返回给操作系统,已达到欺骗操作系统的目的. 下面还是以 ...

  6. JFrame图形界面 ----鼠标消息

    #开始 不管是什么GUI 按钮的存在都是必不可少的而且还会有很多奇怪的按钮 #代码 package window; import java.awt.Container; import java.awt ...

  7. C/C++控制台接收不到鼠标消息-【解决办法】

    控制台编程中,使用了鼠标操作,遇到了控制台无法接收到鼠标消息的问题,可尝试一下办法解决 [win10系统] 在控制台标题栏右键-默认值-选项,将一下对勾取消 然后调用如下函数: HANDLE hIn ...

  8. WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件

    在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件.例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开.在这个过程中,控 ...

  9. [UE4]工程设置:自动捕获鼠标、通过代码设置鼠标显示隐藏、输入模式、编译时自动保存

    一.在4.20版本中运行游戏,在没有进行任何设置的情况下,游戏不会自动捕获鼠标,游戏不会接受输入,需要手动点一下游戏界面才行.如果要跟老版本一样运行游戏自动捕获鼠标,需要进行设置 二.也可以通过代码的 ...

随机推荐

  1. MFC异常处理的问题

    参考文献:http://technet.microsoft.com/zh-cn/library/t078xe4f(v=vs.85).aspx MFC中异常处理的语法和语义构建在标准C++异常处理语法和 ...

  2. Linux命令-查看进程命令:pstree

    查看进程树,ps aux查看进程,如果进程太多看起来很不方便,可以使用pstree以树形方式显示正在运行的所有进程 pstree -p 查看进程树 还是太多了,可以使用管道符进行查找httpd(apa ...

  3. linux的cat命令

    1 描述 cat 的全称 concatenate files and print on the standard output cat命令事Linux下的一个文本输出命令. 用于链接文件并打印到标准输 ...

  4. 编码规范:Eclipse Checkstyle配置

    http://chenzhou123520.iteye.com/blog/1627618 http://www.cnblogs.com/lanxuezaipiao/p/3202169.html

  5. python标准库介绍——24 traceback 模块详解

    ==traceback 模块== [Example 2-18 #eg-2-18] 展示了 ``traceback`` 模块允许你在程序里打印异常的跟踪返回 (Traceback)信息, 类似未捕获异常 ...

  6. python标准库介绍——22 UserList 模块详解

    ==UserList 模块== ``UserList`` 模块包含了一个可继承的列表类 (事实上是对内建列表类型的 Python 封装). 在 [Example 2-16 #eg-2-16] 中, / ...

  7. Java 异常处理的 9 个最佳实践

    在 Java 中,异常处理是个很麻烦的事情.初学者觉得它很难理解,甚至是经验丰富的开发者也要花费很长时间决定异常是要处理掉和抛出. 所以很多开发团队约定一些原则处理异常.如果你是一个团队的新成员,你可 ...

  8. Linux常用命令的解释

    作者博客已转移,http://www.daniubiji.cn/archives/25 Linux简介及Ubuntu安装 常见指令 系统管理命令 打包压缩相关命令 关机/重启机器 Linux管道 Li ...

  9. 将linux下的rm命令改造成mv到指定的目录下

    rm是Linux下文件删除的命令,它是Linux下非常强大却又非常危险的一条命令,特别是rm -rf有时候强大到让你欲哭无泪,当你想清除当前目录下的所有文件和目录时,很简单#rm -rf ./*这没什 ...

  10. spring mvc 2.5.6配置

    兼容公司老版本号项目.必须得用spring mvc2.5.6,那么问题来了. 怎么配置controller都抛出no mapping的错误.经过查文档得出下面配置.仅供參考. servlet-conf ...