C# 列出带有C和WMI的USB设备
我试图在我的应用程序中实现一个功能,列出计算机中所有插入式USB大容量存储设备 我的代码在启动应用程序时运行良好,但我的问题是,我希望在移除或连接USB设备时,表单中的框会自动刷新 实现DBT_DEVICEARRIVAL和DBT_DeviceMoveComplete条件应该可以工作,但我得到了一个断开连接的上下文检测到异常 我了解到我需要使用一个委托并设置一个异步调用,这样才能正常工作 这是我的密码:C# 列出带有C和WMI的USB设备,c#,usb,wmi,C#,Usb,Wmi,我试图在我的应用程序中实现一个功能,列出计算机中所有插入式USB大容量存储设备 我的代码在启动应用程序时运行良好,但我的问题是,我希望在移除或连接USB设备时,表单中的框会自动刷新 实现DBT_DEVICEARRIVAL和DBT_DeviceMoveComplete条件应该可以工作,但我得到了一个断开连接的上下文检测到异常 我了解到我需要使用一个委托并设置一个异步调用,这样才能正常工作 这是我的密码: public void listUSB() {
public void listUSB()
{
ManagementScope sc = new ManagementScope(wmiUsbList);
ObjectQuery query = new ObjectQuery("select * from Win32_DiskDrive " + "where InterfaceType='USB'");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(sc, query);
ManagementObjectCollection result = searcher.Get();
foreach (ManagementObject obj in result)
{
if (obj["DeviceID"] != null)
{
usbListTextBox.AppendText(obj["Model"].ToString());
}
}
}
我很想知道如何将委托应用于我的方法
我还研究了MSDN上的线程,它提供了一个很好的示例,但在那个示例中,我不理解如何将deviceList放入文本框中
我还在学习,所以如果有人能在我的一个或两个问题上为我指出正确的方向,我将不胜感激
谢谢 尝试使用ManagementEventWatcher并为EventWatcher分配事件处理程序
我不知道如何做到这一点,但这里有一个监听打印事件的观察者:
string printQuery = "Select * From __InstanceCreationEvent Within 1 Where TargetInstance ISA 'Win32_PrintJob'";
string nspace = @"\\.\root\CIMV2";
var watcher = new ManagementEventWatcher(nspace, printQuery);
希望能有帮助
private usbListArrayDelegate mDeleg;
protected override void WndProc(ref Message m)
{
int devType;
base.WndProc(ref m);
switch (m.WParam.ToInt32())
{
case DBT_DEVICEARRIVAL:
devType = Marshal.ReadInt32(m.LParam, 4);
if (devType == DBT_DEVTYP_VOLUME)
{
// usb device inserted, call the query
mDeleg = new usbListArrayDelegate(usbListArray);
AsyncCallback callback = new AsyncCallback(usbListArrayCallback);
// invoke the thread that will handle getting the friendly names
mDeleg.BeginInvoke(callback, new object());
}
break;
case DBT_DEVICEREMOVECOMPLETE:
devType = Marshal.ReadInt32(m.LParam, 4);
if (devType == DBT_DEVTYP_VOLUME)
{
mDeleg = new usbListArrayDelegate(usbListArray);
AsyncCallback callback = new AsyncCallback(usbListArrayCallback);
// invoke the thread that will handle getting the friendly names
mDeleg.BeginInvoke(callback, new object());
}
break;
}
}
public ArrayList usbListArray()
{
ArrayList deviceList = new ArrayList();
manager = new UsbManager(); ==> about how to implement this please see http://www.codeproject.com/Articles/63878/Enumerate-and-Auto-Detect-USB-Drives
UsbDiskCollection disks = manager.GetAvailableDisks();
foreach (UsbDisk disk in disks)
{
deviceList.Add(disk);
}
return deviceList;
}
// delegate wrapper function for the getFriendlyNameList function
private delegate ArrayList usbListArrayDelegate();
// callback method when the thread returns
private void usbListArrayCallback(IAsyncResult ar)
{
string ArrayData = string.Empty;
// got the returned arrayList, now we can do whatever with it
ArrayList result = mDeleg.EndInvoke(ar);
int count = 0;
foreach (UsbDisk disk in result)
{
++count;
ArrayData += count + ") " + disk.ToString().
}