调用devcon.exe控制usb设备

上传人:j****9 文档编号:45544060 上传时间:2018-06-17 格式:DOC 页数:6 大小:58KB
返回 下载 相关 举报
调用devcon.exe控制usb设备_第1页
第1页 / 共6页
调用devcon.exe控制usb设备_第2页
第2页 / 共6页
调用devcon.exe控制usb设备_第3页
第3页 / 共6页
调用devcon.exe控制usb设备_第4页
第4页 / 共6页
调用devcon.exe控制usb设备_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《调用devcon.exe控制usb设备》由会员分享,可在线阅读,更多相关《调用devcon.exe控制usb设备(6页珍藏版)》请在金锄头文库上搜索。

1、调用调用 devcon.exe 控制控制 usb 设备设备 3 天前跟硕哥聊天时,他给我发了个有意思的程序-控制 usb 设备的拔插。当时我正 好看到 cookbook 的 IO 处理,就觉得肯定是手到擒来(bs 下自己)。第二天才开始动手, 随手按照 cookbook 上的写了个:private void InitUsbDrives() DriveInfo allDrives = DriveInfo.GetDrives();foreach (DriveInfo d in allDrives)if (d.DriveType = DriveType.Removable)listUsbDrives

2、.Items.Add(d.Name); 结果什么也没有显示。这就奇怪了,这是为什么呢?原来 GetDrives()方法只是获取逻辑 盘符。我当时电脑上没有插入 u 盘,当然就没有显示咯。而硕哥发给我的程序显示的是所 有 usb 接口的。那我就去搜,首先是 msdn 上关于 io 命名空间的查看,但是没有什么收 获。只好求助 google,什么遍历 usb 接口,监听 usb 接口,侦听 usb 端口,查看所有 usb 端口,跟 usb 相关的都找了。网上最多的是一个 usb 接口类的编写,但是没有实质 的内容。当然,还是搜索到一定成果。比如有个也很多的监听方法: public const in

3、t 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

4、= 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;prot

5、ected override void WndProc(ref Message m)tryif (m.Msg = WM_DEVICECHANGE)switch (m.WParam.ToInt32()case WM_DEVICECHANGE:break;case DBT_DEVICEARRIVAL:/U 盘有插入this.timer1.Enabled = true;DriveInfo s = DriveInfo.GetDrives();foreach (DriveInfo DriveI in s)if (DriveI.DriveType = DriveType.Removable)/ Ls.Sh

6、ow();/ this.Hide();/ MessageBox.Show(“sss“);break;int devType = Marshal.ReadInt32(m.LParam, 4);if (devType = DBT_DEVTYP_VOLUME)DEV_BROADCAST_VOLUME vol;vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME);ID=vol.dbcv_unitmask.ToString(“x“);this.Text = IO(ID);this

7、.Tag = IO(ID);/if (item.Length =0|IO(ID)!=this.Tag.ToString ()/this.label1.Text = this.Text;break;case DBT_CONFIGCHANGECANCELED:break;case DBT_CONFIGCHANGED:break;case DBT_CUSTOMEVENT:break;case DBT_DEVICEQUERYREMOVE:break;case DBT_DEVICEQUERYREMOVEFAILED:break;case DBT_DEVICEREMOVECOMPLETE: /U 盘卸载D

8、riveInfo I = DriveInfo.GetDrives();foreach (DriveInfo DrInfo in I)int devType = Marshal.ReadInt32(m.LParam, 4);if (devType = DBT_DEVTYP_VOLUME)DEV_BROADCAST_VOLUME vol;vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME);ID = vol.dbcv_unitmask.ToString(“x“);this.

9、Text = IO(ID) + “盘退出!n“;this.label1.Text += this.Text;/ MessageBox.Show(“U 盘已经卸载“, “信 息提示“, MessageBoxButtons.OK, MessageBoxIcon.Information);break;case DBT_DEVICEREMOVEPENDING:break;case DBT_DEVICETYPESPECIFIC:break;case DBT_DEVNODES_CHANGED:break;case DBT_QUERYCHANGECONFIG:break;case DBT_USERDEFIN

10、ED:break;default:break;catch (Exception ex)throw new Exception(ex.Message);base.WndProc(ref m);这个代码有几个版本,但大致都是差不多的,就是重写 WndProc(ref Message m),判 断传入的消息是否为 u 盘插入信息,然后显示 u 盘此时的盘符。有个比较好的版本,还可 以启用 和禁用 usb 端口。但是这不是我需要的效果。继续找寻,在 csdn 某个问题贴中又找到一 点有用的信息:string comPorts = System.IO.Ports.SerialPort.GetPortNa

11、mes(); foreach(string s in comPorts) listUsbDrives.Items.Add(s); 显示出了 com1 和 com2 两个结果,自我感觉离真相不远了。SerialPort 是串口的意识, 那是不是有 UsbPort 呢?马上兴奋地查看 msdn,结果失望了。 不存在!而且唯一有的就是 SerialPort。但是提供了我一个思路,usb 是计算机的物理端 口,那么我查看计算机信息不就有么?有这个类来帮助我查看吗? 是有的,System.Management。但是自己不太会用,就有 google 了一下。大致用法如 此:private Manageme

12、ntClass mc; private ManagementObjectCollection moc; private void InitUsbDrives() mc = new ManagementClass(“Win32_USBController“);moc = mc.GetInstances();String USBInfo = string.Empty;foreach (ManagementObject mo in moc)foreach (PropertyData pd in mo.Properties)if (pd.Name.Equals(“DeviceID“)USBInfo =

13、 pd.Value + “n“;if (pd.Name.Equals(“Manufacturer“)USBInfo = USBInfo + “ 厂商:“ + pd.Value + “n“;else if (pd.Name.Equals(“Name“)USBInfo = USBInfo + “ USB 控制器名称:“ + pd.Value + “n“;else if (pd.Name.Equals(“Status“)USBInfo = USBInfo + “ USB 状态态:“ + pd.Value + “n“;else if (pd.Name.Equals(“PNPDeviceID“)USBI

14、nfo = USBInfo + “ USB 控制器 ID:“ + pd.Value;listUsbDrives.Items.Add(USBInfo); 但是这样并不能按我想要的方式显示,然后感觉肯定和 Win32_USBController 有关系, 所以继续上 msdn。查看了改函数:http:/ 只有英文的,所以边看边翻译。将可能是的参数试了个遍,这下终于八九不离十了。就打 算动手写,这时,这时我注意到硕哥发我的 rar 中 有个 devcon.exe。这东西是什么呢?于是借助 Reflector 查看了下硕哥发我的程序。发 现真是调用这个东东,继续 google 下,发现这个工具很好用。

15、 devcon 帮助文档:http:/ devcon 设备启用和禁用:http:/ C#cookbook 的 IO 中正好有关于命令行交互的,于是乎,很晚了,就去睡了。躺在床上 就在想,该怎么写呢? 第二天起来后就继续工作:首先是 cmd 的调用: public static string RunProcessCmd(string command)Process application = new Process();application.StartInfo.FileName = “cmd.exe“;application.StartInfo.Arguments = “/c“ + command;application.StartInfo.RedirectStandardInput = true;application.StartInfo.RedirectStandardOutput = true;application.StartInfo.UseShellExecute = false;application.StartInfo.CreateNoWindow = true;application.Start();application.StandardInput.WriteLine(“exit“);string str

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 初中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号