none
有办法使用C# 监测光驱 USB设备的使用情况么? RRS feed

  • 问题

  • RT。

    想通过C# 获得如下功能

    1、光驱是否正在工作,也就是是否正在读盘。

    2、某一时刻USB端口是否有外设连接 比如USB连接了一个摄像头,一个数码相机 那么就连接了2个设备如果只连接了一个数码相机那么就是一个设备,只要知道连接的外部设备的数量就可以。

    2010年8月20日 8:53

答案

  • 光驱不知道,但是USB可以,尝试:

    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)
      {
       
      }

      }
    }

    2010年8月23日 3:38
    版主

全部回复

  • C#不过是一个编码规范而已,本身没有任何功能。你要和硬件通讯的话得需要硬件的开发包,比如Windows DDK。Windows DDK不支持C#开发,建议用C++写代码做桥。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年8月22日 3:14
    版主
  • thank you!我可以理解为 C#暂时不提供类似的功能 无法实现么?因为现在正在做需求分析,只能使用C# 而且我也不会C++ 我想我可以学会 做这个,但是可能成本太高了,如果很困难的话 我可以直接回复他们 不可以就 OK了。我搜索了一下 有关于C# 控制光驱 开关的代码 但是 没有发现可以检测光驱使用情况的代码。所以才提问的。
    2010年8月23日 1:31
  • 您好 其实可以很简单  您调用 Microsoft Shell Objects 的com  检测光驱的图标和右键菜单的项目状态就可以了。

     


    成为 Microsoft V Dash了。。。 欢迎各位前辈同事在OCS加我
    2010年8月23日 1:51
    版主
  • 您好 能提供一些 有关 Microsoft Shell Objects  的com 检测光驱的资料么?在网上搜了一下 不太清楚啊。

    Thank you。

    2010年8月23日 3:31
  • 光驱不知道,但是USB可以,尝试:

    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)
      {
       
      }

      }
    }

    2010年8月23日 3:38
    版主
  • 你好 :

      我测试了一下 这段代码 ,我分别使用了 USB 光驱、摄像头,U盘进行测试。

    只有识别U 盘 无法识别 其它的设备,如果知道的原因的话请告诉一下。而且 如果U盘已经在PC机上了再打开这个程序 也无法识别。

    还有它会隔一段时间 就执行 到 case DBT_DEVNODES_CHANGED://可用,设备变化时 这个地方不断弹出 "9"这个信息。这是怎么回事儿,按理说 USB设备刚刚接入的时候会出这个 信息但现在 感觉根本不起作用。
    • 已编辑 scoket.joe 2010年8月27日 2:55 update
    2010年8月27日 2:20