码迷,mamicode.com
首页 > 其他好文 > 详细

C#拦截系统消息

时间:2014-10-05 21:24:08      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   文件   

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


bubuko.com,布布扣/**//*C#截取系统消息 */
bubuko.com,布布扣 
bubuko.com,布布扣//一、截取系统消息
bubuko.com,布布扣//方法一:
bubuko.com,布布扣//添加监视消息
bubuko.com,布布扣private void Form_Load(object sender, System.EventArgs e)
bubuko.com,布布扣{
bubuko.com,布布扣  Application.AddMessageFilter(this);
bubuko.com,布布扣}
bubuko.com,布布扣//撤消消息监视
bubuko.com,布布扣private void Form_Closing(object sender, System.ComponentModel.CancelEventArgs e)
bubuko.com,布布扣{
bubuko.com,布布扣  Application.RemoveMessageFilter(this);
bubuko.com,布布扣}
bubuko.com,布布扣//截取消息,进行处理
bubuko.com,布布扣public bool PreFilterMessage(ref System.Windows.Forms.Message m)
bubuko.com,布布扣{
bubuko.com,布布扣  switch(m.Msg )
bubuko.com,布布扣  {
bubuko.com,布布扣  case 513:        //拦截左键单击事件 
bubuko.com,布布扣  MessageBox.Show("哈哈,你点击了左键被拦截!");
bubuko.com,布布扣  return true;    //返回true则消息被裁取,系统不再处理
bubuko.com,布布扣  case 516:        //拦截左键单击事件 
bubuko.com,布布扣  MessageBox.Show("哈哈,你点击了右键被拦截!");
bubuko.com,布布扣  return true;    //返回true则消息被裁取,系统不再处理
bubuko.com,布布扣  default:
bubuko.com,布布扣  return false;    //返回false则消息未被裁取,系统会处理
bubuko.com,布布扣  }
bubuko.com,布布扣} 
bubuko.com,布布扣//方法二: 
bubuko.com,布布扣//截取消息,进行处理 
bubuko.com,布布扣protected override void WndProc(ref Message m) 
bubuko.com,布布扣{
bubuko.com,布布扣  switch(m.Msg)
bubuko.com,布布扣  {
bubuko.com,布布扣  case 17:
bubuko.com,布布扣  MessageBox.Show("哈哈,你不能关闭计算机!");
bubuko.com,布布扣  m.Result=(IntPtr)0;
bubuko.com,布布扣  break;
bubuko.com,布布扣  case 513:
bubuko.com,布布扣  MessageBox.Show("哈哈,你不能点击左键!"); 
bubuko.com,布布扣  m.Result=(IntPtr)0;
bubuko.com,布布扣  break;
bubuko.com,布布扣  case 516:
bubuko.com,布布扣  MessageBox.Show("哈哈,你不能点击右键!"); 
bubuko.com,布布扣  m.Result=(IntPtr)0;
bubuko.com,布布扣  break;
bubuko.com,布布扣  default:
bubuko.com,布布扣  base.WndProc(ref m);
bubuko.com,布布扣  break;
bubuko.com,布布扣  }
bubuko.com,布布扣} 
bubuko.com,布布扣 
bubuko.com,布布扣//以上转自淘软网-水兰色心情版主

    而上次写的软件用的就是第二种方法。因为习惯了,这次还是用这种方法吧。
    现在我们改写这个方法,我们必须知道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消息
bubuko.com,布布扣        {
bubuko.com,布布扣            const int WM_DEVICECHANGE = 0x219;
bubuko.com,布布扣            const int WM_DEVICEARRVIAL   =   0x8000;//如果m.Msg的值为0x8000那么表示有U盘插入
bubuko.com,布布扣            const int WM_DEVICEMOVECOMPLETE=0x8004;
bubuko.com,布布扣            switch (m.Msg)
bubuko.com,布布扣            {
bubuko.com,布布扣                case WM_DEVICECHANGE:
bubuko.com,布布扣                    {
bubuko.com,布布扣                        ShowDeviceChanged("WM_DEVICECHANGE");//
bubuko.com,布布扣                        if (m.WParam.ToInt32() == WM_DEVICEARRVIAL)
bubuko.com,布布扣                            ShowDeviceChanged("WM_DEVICEARRVIAL");
bubuko.com,布布扣                        else if (m.WParam.ToInt32() == WM_DEVICEMOVECOMPLETE)
bubuko.com,布布扣                            ShowDeviceChanged("WM_DEVICEMOVECOMPLETE");
bubuko.com,布布扣                    }
bubuko.com,布布扣                    break;
bubuko.com,布布扣            }
bubuko.com,布布扣            base.WndProc(ref m); //将系统消息传递自父类的WndProc
bubuko.com,布布扣        }
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣        private void BTN_Start_Click(object sender, EventArgs e)
bubuko.com,布布扣        {
bubuko.com,布布扣
bubuko.com,布布扣        }
bubuko.com,布布扣        public void ShowDeviceChanged(string message)
bubuko.com,布布扣        {
bubuko.com,布布扣            switch(message)
bubuko.com,布布扣            {
bubuko.com,布布扣                case "WM_DEVICECHANGE":
bubuko.com,布布扣                    this.textBox_Message.Text += "Device Changed \r\n";
bubuko.com,布布扣                    break;
bubuko.com,布布扣                case "WM_DEVICEMOVECOMPLETE":
bubuko.com,布布扣                    this.textBox_Message.Text += "Device Moved\r\n";
bubuko.com,布布扣                    break;
bubuko.com,布布扣                case "WM_DEVICEARRVIAL":
bubuko.com,布布扣                    this.textBox_Message.Text += "Device Arrived\r\n";
bubuko.com,布布扣                    break;
bubuko.com,布布扣            }
bubuko.com,布布扣        }

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

C#拦截系统消息

标签:style   blog   http   color   io   os   ar   for   文件   

原文地址:http://www.cnblogs.com/milantgh/p/4007289.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!