比较常用的是重载Form的DefWndProc方法,例如截取鼠标按下的消息:

protected override void DefWndProc(ref Message m)
    {
      if ( m.Msg == 0x0201 )
      {
        MessageBox.Show(m.Msg.ToString());
      }
      else
      {
        base.DefWndProc (ref m);
      }
    }

还可以通过另一种办法,使用IMessageFilter 接口:

public class
MessageFilter : IMessageFilter
  {
        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg == 0x0201)
            {
                MessageBox.Show("WM_LBUTTONDOWN is: " +
m.Msg);
                return true;
            }
            return false;
    }
  }

  然后使用Application.AddMessageFilter方法,例如:

  private static
MessageFilter msgFliter = new MessageFilter();

  在Main方法中注册消息筛选器:

  Application.AddMessageFilter(msgFliter);

  如果要取消注册,可以调用Application.RemoveMessageFilter方法

  在这里有一个Windows的MessageID的枚举,挺有用的,好几次都忘了地址,这次写在这里好好保存

  Windows Message ID
constants

一、截取系统消息

方法一:

//添加监视消息
private void Form_Load(object sender, System.EventArgs e)
{
  Application.AddMessageFilter(this);
}

//撤消消息监视
private void Form_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{
  Application.RemoveMessageFilter(this);
}

//截取消息,进行处理
public bool PreFilterMessage(ref System.Windows.Forms.Message
m)
{
  switch(m.Msg )
  {
    case 513:        //拦截左键单击事件 
      MessageBox.Show("哈哈,你点击了左键被拦截!");
      return true;    //返回true则消息被裁取,系统不再处理
    case 516:        //拦截左键单击事件 
      MessageBox.Show("哈哈,你点击了右键被拦截!");
      return true;    //返回true则消息被裁取,系统不再处理
    default:
      return false;    //返回false则消息未被裁取,系统会处理
  }
}

方法二:

//截取消息,进行处理 
protected override void WndProc(ref Message
m) 
{
  switch(m.Msg)
  {
    case 17:
      MessageBox.Show("哈哈,你不能关闭计算机!");
      m.Result=(IntPtr)0;
      break;
    case 513:
      MessageBox.Show("哈哈,你不能点击左键!"); 
      m.Result=(IntPtr)0;
      break;
    case 516:
      MessageBox.Show("哈哈,你不能点击右键!"); 
      m.Result=(IntPtr)0;
      break;
    default:
      base.WndProc(ref m);
      break;
  }
}

C#实现在Form上截取消息的两种方法的更多相关文章

  1. RabbitMQ实现延时消息的两种方法

    目录 RabbitMQ实现延时消息的两种方法 1.死信队列 1.1消息什么时候变为死信(dead-letter) 1.2死信队列的原理 1.3 代码实现 1.4死信队列的一个小坑 2 .延时插件 2. ...

  2. GitHub常用上传文件的两种方法 附带常见的问题及Git安装教程

    从早上下课到现在一直在琢磨如何给Github下载本地文件,中午饭都没吃.还好是解决了,感觉挺有成就感的.O(∩_∩)O哈哈~ 好哒 闲话不说,说重点. 一.git的安装 百度云:http://pan. ...

  3. iManager微服务自定义上传数据的两种方法

    背景 当数据量大时,通过浏览器上传可能速度较慢,可以使用以下两种方式进行数据导入. 方法一 1.访问k8s主页(31234端口) 找到所创建的微服务的命名空间(例如icloud-native-xxx) ...

  4. linux服务器上安装jdk8的两种方法

    这里介绍两种安装方式: yum安装(力荐) 从官网下载包安装 获得一台linux服务器 要在linux下安装jdk,首先你得先有一台linux服务器,虚拟机或者租一台都可以   yum安装jdk 在l ...

  5. SecureCRT 上传文件的两种方法 Zmodem、SFTP

    Zmodem: 无论有xshell还是secureCRT连接linux的时. 默认都用一个zmodem可以帮助window和linux之间传输文件 很方便和实用的工具. 不过默认是无法使用的 需要安装 ...

  6. form表单上传附件的几种方法

    问题描述:在网页开发过程中,当需要上传附件(图片,音频,视频等)时,常规方法是使用form表单进行提交,这里总结一下form表单提交的几种方法. 参考地址:http://www.cnblogs.com ...

  7. net上传文件的三种方法

    ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. Test.aspx关 ...

  8. Android 截取手机屏幕两种实现方案解析

    近期在开发的过程中,遇到了一个须要截取屏幕保存为图片的需求,详细为截取webview的视图保存图片. 方法1:首先想到的思路是利用SDK提供的View.getDrawingCache()方法: pub ...

  9. C#代码像QQ的右下角消息框一样,无论现在用户的焦点在哪个窗口,消息框弹出后都不影响焦点的变化,那么有两种方法

    你QQ的右下角消息框一样,无论现在用户的焦点在哪个窗口,消息框弹出后都不影响焦点的变化,那么有两种方法: 要么重写需要弹出的窗体的事件: protected override CreateParams ...

随机推荐

  1. vue cli 3 & webpack-merge & webpack 3 & bug

    vue cli 3 & webpack-merge & webpack & bug bug webpack-merge & bug webpack-merge ??? ...

  2. php curl模块开启失败解决参考

    现在公司的测试项目和正式项目是部署在同一台服务器上的,为了在重启apache时互不影响,我在服务器上部署了两个apache服务,使用nginx做url转发. 结果正式环境的项目使用curl没有问题,但 ...

  3. 《R语言实战》读书笔记--第三章 图形初阶(二)

    3.4添加文本.自定义坐标轴和图例 很多作图函数可以设置坐标轴和文本标注.比如标题.副标题.坐标轴标签.坐标轴范围等.需要注意的是并不是所有的绘图函数都有上述的参数,需要进行验证.可以将一些默认的参数 ...

  4. java 复习整理(一 java简介和基础语法)

    现在公司用的是封装太多东西的平台开发,觉着之前学的东西很多都忘了,所以想好好总结回顾一下.之前总是想学很多编程语言像python.s6.node.react,但现在越来越体会到编程语言只是一个开发的工 ...

  5. vue刨坑(二)

    vue实例 vue实例 每一个应用都是通过vue这个构造函数创建根实例(root instance),启动 new vue(选项对象) 需要传入选项对象,对象包含挂载元素,数据,模板,方法等. el: ...

  6. UVALIVE 3031 Cable TV Network

    题意:求点联通度 首先看了别人的题解还是不晓得只枚举汇点的原因觉得行不通 关于求点联通度的建图方法 转自http://hi.baidu.com/lerroy312/item/5a5f36f2f5bba ...

  7. resin启动问题

    启动resin时报错如下: Resin/4.0.28 can't restart -server 'app-0'. com.caucho.bam.RemoteConnectionFailedExcep ...

  8. kubernetes 安装(全)

    #http://blog.csdn.net/zhuchuangang/article/details/76572157#https://kubernetes.io/docs/setup/indepen ...

  9. Appium+python自动化17-启动iOS模拟器APP源码案例【转载】

    前言 上一篇已经可以启动iOS模拟器上的safari浏览器了,启动app比启动浏览器要复杂一点,本篇以github上的源码为案例详细介绍如何启动iOS模拟器的app 一.clone源码 1.githu ...

  10. RobotFramework自动化3-搜索案例【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/robotframework/ 前言 RF系列主要以案例为主,关键字不会的可以多按按F5 ...