首先我们看下有哪几种拦截系统消息的方法:

 
//一、截取系统消息
//方法一:
//添加监视消息
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;
 }

 

而上次写的软件用的就是第二种方法。因为习惯了,这次还是用这种方法吧。
   
现在我们改写这个方法,我们必须知道U盘插入拔出的系统消息。
DEVICECHANGE   0X219
DEVICEARRVIE    0X8000
DEVICEREMOVE   0X8004

我们拦截了DEVICECHANGE然后用tostring()方法:
msg=0x219 (WM_DEVICECHANGE) hwnd=0x50e54 wparam=0x8000
lparam=0x475e89c
result=0x0
    也就是说,当有驱动器加载时是发送WM_DEVICECHANGE消息,但是判断驱动器是加载还是卸载就要判断WPARAM字段是DEVICEARRIVE还是DEVICEMOVE,所以我们编写如下测试代码。
    程序说明:

        protected override void WndProc(ref Message m)//监视Windows消息
        {
            const int WM_DEVICECHANGE = 0x219;
            const int WM_DEVICEARRVIAL   =   0x8000;//如果m.Msg的值为0x8000那么表示有U盘插入
            const int WM_DEVICEMOVECOMPLETE=0x8004;
            switch (m.Msg)
           {
                case WM_DEVICECHANGE:
                  {
                        ShowDeviceChanged("WM_DEVICECHANGE");//
                        if (m.WParam.ToInt32() == WM_DEVICEARRVIAL)
                            ShowDeviceChanged("WM_DEVICEARRVIAL");
                        else if (m.WParam.ToInt32() == WM_DEVICEMOVECOMPLETE)
                            ShowDeviceChanged("WM_DEVICEMOVECOMPLETE");
                    }
                    break;
            }
            base.WndProc(ref m); //将系统消息传递自父类的WndProc
        }

        public void ShowDeviceChanged(string message)
        {
            switch(message)
            {
                case "WM_DEVICECHANGE":
                    this.textBox_Message.Text += "Device Changed \r\n";
                    break;
                case "WM_DEVICEMOVECOMPLETE":
                    this.textBox_Message.Text += "Device Moved\r\n";
                   break;
                case "WM_DEVICEARRVIAL":
                    this.textBox_Message.Text += "Device Arrived\r\n";
                    break;
           }
       }
 

C#拦截系统消息的更多相关文章

  1. C#拦截系统消息的方法-Application.AddMessageFilter

    C#拦截系统消息的方法Application.AddMessageFilter Application.AddMessageFilter这个方法可以接收系统发出的消息: 首先定义一个类,继承IMess ...

  2. WPF.UIShell UIFramework之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)

    无论是在工作和学习中使用WPF时,我们通常都会接触到CustomControl,今天我们就CustomWindow之后的一些边角技术进行探讨和剖析. 窗口(对话框)模态闪动(Blink) 自定义窗口的 ...

  3. c# 如何处理自定义消息

    C#自定义消息通信往往采用事件驱动的方式实现,但有时候我们不得不采用操作系统的消息通信机制,例如在和底层语言开发的DLL交互时,是比较方便的.下面列举了一些实现方式,供大家参考:一.通过SendMes ...

  4. Winform改变Textbox边框颜色(转)

    namespace MyTextBoxOne { //使用时必须把文本框的BorderStyle为FixedSingle才能使用 //一些控件(如TextBox.Button等)是由系统进程绘制,重载 ...

  5. 实现类QQ的编辑框

    第一步,平面效果.Windows系统有几个消息专门用来处理Windows组件的边框部位,那就是WM_NCCALCSIZE和WM_NCPAINT这两个消息,从消息名字看来NC这个就代表着No Clien ...

  6. C#在WinForm中重写ProgressBar控件(带%的显示)

    废话少说,直接上码: namespace csPublish { [ToolboxItem(true)] class textProgressBar : System.Windows.Forms.Pr ...

  7. C# Winfrom 自定义控件——带图片的TextBox

    效果: 描述: 本来是想用GDI在左边画图片上去的,文本是居中对齐,如果文本是左对齐,文本会把图片遮住控件长这样: 但这样做,输入框在获取焦点时候,会把图片挡住就像这样: 输入完成之后图片就会显示完整 ...

  8. Winform改变Textbox边框颜色

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. 【转】C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1)

    C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1) #region 截获消息        /// 截获消息  处理XP不能关机问题        protected ...

随机推荐

  1. poj1329 Circle Through Three Points

    地址:http://poj.org/problem?id=1329 题目: Circle Through Three Points Time Limit: 1000MS   Memory Limit: ...

  2. python weekday()函数

    def weekday(self): """Return the day of the week as an integer, where Monday is 0 and ...

  3. c++第二十一天

    p115~p118: 1.区分int *p[4];和int (*p)[4];.前者是整型指针的数组,后者是指向含有4个整数的数组. 2.规避上述问题的方法就是:使用 auto和 decltype. 3 ...

  4. 构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)

    构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study ...

  5. linux下 ip指令

    目录 Network ip command Command :ip 简介 内容 Network ip command Command :ip 简介 ip 是個指令喔!並不是那個 TCP/IP 的 IP ...

  6. Python3基础 try-except 几个异常采取同样的处理方法

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. java虚拟机类加载

    java虚拟机中类的加载 (JVM的大致结构图) 从发class文件到内存中的类,按先后顺序,需要经过加载,链接以及初始化三大步骤. java语言的类型可分为两大类:基本类型(primitive ty ...

  8. python 计算阶乘

    # 用for循环计算 n! sum = n=int(input('请输入n=')) ,n+): ,-): sum *= j # sum=sum*j print('%d!=%3d' %(i,sum)) ...

  9. 手把手教你如何加入到github的开源世界

    我曾经一直想加入到开源项目中,但是因为没有人指导流程,网上看了很多,基本都是说了个大概,如果你也是一个初出茅庐的人,那么,我将以自己提交的一次开源代码为例,教会你步入开源的世界. 1,首先登陆到htt ...

  10. UVA-11082 Matrix Decompressing (网络流建模)

    题目大意:给出一个由1到20组成的整数矩阵的每一行和每一列的和,构造这个矩阵.输出任意一个构造方案. 题目分析:将每一行视作一个点x,将每一列视作一个点y.对于矩阵中的每一个格子,都对应一个二元关系& ...