zoukankan      html  css  js  c++  java
  • C#拦截系统消息

      看到个软件蛮好玩的,叫做ULOGON,它可以让你只有插入了正确的U盘系统才能工作。其实我们也可以简单的用C#来实现这个功能,本文首先来讨论如何拦截系统的U盘插入消息。
        以前写EFFECTIVEKEY软件的时候就要拦截系统键盘按键消息,但是那时是直接网上拉过来用了,没有仔细研究。今天期末考完了就好好分析下。
        首先我们看下有哪几种拦截系统消息的方法:


    /**//*C#截取系统消息 */
     
    //一、截取系统消息
    //方法一:
    //添加监视消息
    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,所以我们编写如下测试代码。
        程序说明:
    编译环境:VISTA+VS2005(C# WINDOWS FORM)
    窗体设计:一个TEXTBOX(NAME: TextBox_Message)

    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
            }


            private void BTN_Start_Click(object sender, EventArgs e)
            {

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

        知道有U盘插入后我们可以判断插入的U盘中有没有我们需要的证书文件,如果没有就锁了电脑~呵呵。
        思路就是这样,当然是十分简单的实现,如果真想写的好点可能还需要重写GINA.DLL,有兴趣的自己去MSDN查查资料吧。

  • 相关阅读:
    Java ConcurrentModificationException 异常分析与解决方案
    Kafka剖析(一):Kafka背景及架构介绍
    Linux下更改oracle客户端字符集和服务端字符集
    storm-kafka源码走读之KafkaSpout
    kafka系列之(3)——Coordinator与offset管理和Consumer Rebalance
    Kafka源码深度解析-序列7 -Consumer -coordinator协议与heartbeat实现原理
    apache kafka系列之在zookeeper中存储结构
    Java transient关键字使用小记
    Kafka设计解析(一)- Kafka背景及架构介绍
    JavaScript-如何获取页面元素对象,元素id
  • 原文地址:https://www.cnblogs.com/milantgh/p/4007289.html
Copyright © 2011-2022 走看看