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

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

    n<605设计出n对夸号  给出n个条件每个条件为[l,r] 表示第i对夸号右夸号离左夸号的距离,然后夸号的右夸号出现的顺序必须按照给的顺序 出现, 那么如果存在就输出否则输出impossilb ...

  2. hdu 5017

    好恶心的题 #include <cstdio> #include <string.h> #include <algorithm> #include <cmat ...

  3. python 封装时间常用操作方法-time,datetime

    封装脚本: #encoding=utf-8import timefrom datetime import timedelta,date def date_time_chinese():    prin ...

  4. AVAudioFoundation(1):使用 AVAsset

    本文转自:AVAudioFoundation(1):使用 AVAsset | www.samirchen.com 本文主要内容来自 AVFoundation Programming Guide. 要了 ...

  5. Duilib嵌入CEF禁止浏览器响应拖拽事件

    转载:http://blog.csdn.net/liuyan20092009/article/details/53819473 转载:https://blog.csdn.net/u012778714( ...

  6. xss总结(一直更新)

    反射型: 在表单输入jack网页源代码:<pre>Hello jack</pre> 测试: 低级别:<script>alert('xss')</script& ...

  7. Ubuntu16.04下安装tensorflow(GPU加速)【转】

    本文转载自:https://blog.csdn.net/qq_30520759/article/details/78947034 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...

  8. 算法准备-分治算法解决第k位数的线性查找

    由作业士兵排队问题引出的 在一个划分成网格的操场上,n个士兵散乱地站在网格点上.网格点由整数最表(x,y)表示.士兵可以沿着网格边上.下.左.右移动一步,但在同一时刻一个网格上只能有一名士兵.按照军官 ...

  9. SSM(Spring+SpringMVC+Mybatis)+Mysql 框架整合搭建流程以及其间注意事项

    复习SSM框架,太久没用自己手动撘一个,发现自己还是有很多地方忘记了和没注意的事项... 首先,直接给出总流程: 零.引jar包 1.引包(或者写maven.pom) 一.数据库部分 设计数据库各表结 ...

  10. jq对象和DOM对象的互换

    var oJq;  //JQ对象 var oDom; //dom对象 oDom = oJq[index];  // JQ对象转化为oDom对象 oJq  = $(oDom);      //DOM对象 ...