最近想做一个C#下的USB检测程序,起目的是想监控USB设备,当用户插入设备(U盘、键盘、鼠标等)时能检测出来,当发现是U盘的时候就及时屏蔽他,当是键盘等其他东西时允许他使用。网上找了好多例子都不适合我,基本一刀切的多,所以来CSDN上请教高手来了。

解决方案 »

  1.   

    硬件检测:安装、停用 
    http://www.cnblogs.com/SunYu/archive/2010/04/29/1723977.html
      

  2.   

    那只用识别u盘屏蔽就可以了,识别u盘如下:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;namespace USB
    {
      public partial class Form1 : Form
      {
      public const int WM_DEVICECHANGE = 0x219;
      public const int DBT_DEVICEARRIVAL = 0x8000;
      public const int DBT_CONFIGCHANGECANCELED = 0x0019;
      public const int DBT_CONFIGCHANGED = 0x0018;
      public const int DBT_CUSTOMEVENT = 0x8006;
      public const int DBT_DEVICEQUERYREMOVE = 0x8001;
      public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;
      public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
      public const int DBT_DEVICEREMOVEPENDING = 0x8003;
      public const int DBT_DEVICETYPESPECIFIC = 0x8005;
      public const int DBT_DEVNODES_CHANGED = 0x0007;
      public const int DBT_QUERYCHANGECONFIG = 0x0017;
      public const int DBT_USERDEFINED = 0xFFFF;  public Form1()
      {
      InitializeComponent();
      }  private void Form1_Load(object sender, EventArgs e)
      {  }  protected override void WndProc(ref Message m)
      {
      try
      {
      if (m.Msg == WM_DEVICECHANGE)
      {
      switch (m.WParam.ToInt32())
      {
      case WM_DEVICECHANGE://
      break;
      case DBT_DEVICEARRIVAL://U盘插入
      DriveInfo[] s = DriveInfo.GetDrives();
      foreach (DriveInfo drive in s)
      {
      if (drive.DriveType == DriveType.Removable)
      {
      richTextBox1.AppendText("U盘已插入,盘符为:" + drive.Name.ToString() + "\r\n");
      break;
      }
      }
      break;
      case DBT_CONFIGCHANGECANCELED:
      MessageBox.Show("2");
      break;
      case DBT_CONFIGCHANGED:
      MessageBox.Show("3");
      break;
      case DBT_CUSTOMEVENT:
      MessageBox.Show("4");
      break;
      case DBT_DEVICEQUERYREMOVE:
      MessageBox.Show("5");
      break;
      case DBT_DEVICEQUERYREMOVEFAILED:
      MessageBox.Show("6");
      break;
      case DBT_DEVICEREMOVECOMPLETE: //U盘卸载
      richTextBox1.AppendText("U盘已卸载,盘符为:");
      break;
      case DBT_DEVICEREMOVEPENDING:
      MessageBox.Show("7");
      break;
      case DBT_DEVICETYPESPECIFIC:
      MessageBox.Show("8");
      break;
      case DBT_DEVNODES_CHANGED://可用,设备变化时
      MessageBox.Show("9");
      break;
      case DBT_QUERYCHANGECONFIG:
      MessageBox.Show("10");
      break;
      case DBT_USERDEFINED:
      MessageBox.Show("11");
      break;
      default:
      break;
      }
      }
      }
      catch (Exception ex)
      {
      MessageBox.Show(ex.Message);
      }
      base.WndProc(ref m);
      }  private void button1_Click(object sender, EventArgs e)
      {
       
      }  }
    }
      

  3.   

     /// <summary>
        /// windows消息的常量
        /// </summary>
        class WndProMsgConst
        {
            #region WndProc常量
            public const int WM_DEVICECHANGE = 0x219;
            public const int DBT_DEVICEARRIVAL = 0x8000;
            public const int DBT_CONFIGCHANGECANCELED = 0x0019;
            public const int DBT_CONFIGCHANGED = 0x0018;
            public const int DBT_CUSTOMEVENT = 0x8006;
            public const int DBT_DEVICEQUERYREMOVE = 0x8001;
            public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;
            public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
            public const int DBT_DEVICEREMOVEPENDING = 0x8003;
            public const int DBT_DEVICETYPESPECIFIC = 0x8005;
            public const int DBT_DEVNODES_CHANGED = 0x0007;
            public const int DBT_QUERYCHANGECONFIG = 0x0017;
            public const int DBT_USERDEFINED = 0xFFFF;
            #endregion
        }
      

  4.   

    http://topic.csdn.net/u/20100303/19/9ccf9c8d-6a24-498f-92c0-db79f18bdd10.html?24135
      

  5.   

    修改注册表[HKEY_LOCAL_MACHINE\SYSTEM\CurrentCntrolSet\Services\USBSTOR],将“Start”的DWORD值修改为十六位进制数值“4”。
      

  6.   

    9楼一刀切了,不行
    我给你们提供一个思路吧,能不能调用底层的API实现功能?
      

  7.   

    参考资料,希望对你有帮助!
    1、C#能操作底层么??? 如监控U盘插入拔出、光驱监控的问题
    http://topic.csdn.net/u/20080513/14/765d9fe1-474e-4d1b-8605-017fc960a01a.html?88492
    2、监视U盘,子类中不行,主窗体中可以,为什么?在线等!
    http://topic.csdn.net/u/20100524/11/585c5187-8d2b-4395-8686-9d2ed03cb2d2.html?80311
    3、重写OnWndProc方法,捕获WM_DEVICECHANGED
    U盘加载,卸载,拔出,插入,WM_DEVICECHANGE,WndProc,DBT_DEVICEARRIVAL,DBT_DEVICEREMOVECOMPLETE
    http://www.cnblogs.com/SunYu/archive/2010/04/29/1723962.html
    4、检测U盘插入并自动复制U盘里文件到D盘 C#源码
    http://topic.csdn.net/u/20100303/19/9ccf9c8d-6a24-498f-92c0-db79f18bdd10.html   

  8.   

    computerfox  我很崇拜你!!!向你学习