关于 SD 卡插入 SD 卡的 VolumeChangeEvent 的 WMI 查询 reader 不工作
WMI query on VolumeChangeEvent for SD card insertion into SD card reader not working
我正在开发一个应用程序,我想在将 SD 卡插入 SD 卡时自动处理数据 reader。 SD 卡 reader 插入电脑并分配 E: 和 F: 驱动器,并且在没有插入 SD 卡时显示为灰色。我一直在尝试使用基于 Win32__VolumeChangeEvent 或 Win32__DeviceChangeEvent 的 WMI 查询,但没有成功。我得到的错误 "select * from Win32_VolumeChangeEvent" is invalid class, and "select * from Win32_DeviceChangeEvent" does not show me status updates when I insert an SD card into SD card reader, only for the插入和移除 SD 卡 reader 本身。
我一直用来做实验的 class 是:
namespace eventTest
{
class WMIReceiveEvent
{
static void Main(string[] args)
{
WMIReceiveEvent receiveEvent = new WMIReceiveEvent();
Console.Read();
}
public WMIReceiveEvent()
{
try
{
ManagementScope scope = new ManagementScope("root\CIMV2");
scope.Options.EnablePrivileges = true;
WqlEventQuery query = new WqlEventQuery("select * from Win32_DeviceChangeEvent");
ManagementEventWatcher watcher = new ManagementEventWatcher(scope, query);
Console.WriteLine("Waiting for an event...");
watcher.EventArrived += new EventArrivedEventHandler(HandleEvent);
// Start listening for events
watcher.Start();
}
catch (ManagementException err)
{
Console.WriteLine("An error occurred while trying to receive an event: " + err.Message);
}
}
private void HandleEvent(object sender,
EventArrivedEventArgs e)
{
Console.WriteLine(e.NewEvent.GetPropertyValue("EventType"));
}
}
}
任何人都可以向我们提供一个查询,我可以用它来监控 SD 卡到达 Windows 或者指出为什么 Win32_VolumeChangeEvent 不被接受为有效的 [=24] =] 如果固定的话,如何使用它来监控实际 SD 卡的到达?
以下代码是我的问题的有效解决方案,当 SD 卡进入 USB 连接的 SD 卡时我会收到通知 reader。查询是
SELECT * FROM __InstanceOperationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.Size > 0 AND TargetInstance.Description = "Removable disk"
选择大小 > 0 且涉及可移动驱动器的逻辑磁盘上的所有操作。可以进一步区分操作类型(插入和移除)并检索插入的 SD 卡的驱动器号。 (示例见 this Whosebug question )
编辑:插入时触发的事件似乎是一个“__InstanceModificationEvent”,可以用来代替 __InstanceOperationEvent(__InstanceModificationEvent 是 [=23= 的子类]),在这种情况下查询是:
SELECT * FROM __InstanceModificationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.Size > 0 AND TargetInstance.Description = "Removable disk"
完整示例:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Management;
using System.Threading;
namespace eventTest
{
class WMIReceiveEvent
{
static void Main(string[] args)
{
WMIReceiveEvent receiveEvent = new WMIReceiveEvent();
Console.Read();
}
public WMIReceiveEvent()
{
try
{
ManagementScope scope = new ManagementScope("root\CIMV2");
scope.Options.EnablePrivileges = true;
WqlEventQuery query = new WqlEventQuery("SELECT * FROM __InstanceModificationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.Size > 0 AND TargetInstance.Description = \"Removable disk\"");
ManagementEventWatcher watcher = new ManagementEventWatcher(scope, query);
Console.WriteLine("Waiting for an event...");
watcher.EventArrived += new EventArrivedEventHandler(HandleEvent);
// Start listening for events
watcher.Start();
}
catch (ManagementException err)
{
Console.WriteLine("An error occurred while trying to receive an event: " + err.Message);
}
}
private void HandleEvent(object sender,
EventArrivedEventArgs e)
{
//ManagementBaseObject baseObject = (ManagementBaseObject)e.NewEvent;
// if (baseObject.ClassPath.ClassName.Equals("__InstanceCreationEvent"))
Console.WriteLine("A drive was connected");
//else if (baseObject.ClassPath.ClassName.Equals("__InstanceDeletionEvent"))
//Console.WriteLine("A drive was removed");
}
}
}
我正在开发一个应用程序,我想在将 SD 卡插入 SD 卡时自动处理数据 reader。 SD 卡 reader 插入电脑并分配 E: 和 F: 驱动器,并且在没有插入 SD 卡时显示为灰色。我一直在尝试使用基于 Win32__VolumeChangeEvent 或 Win32__DeviceChangeEvent 的 WMI 查询,但没有成功。我得到的错误 "select * from Win32_VolumeChangeEvent" is invalid class, and "select * from Win32_DeviceChangeEvent" does not show me status updates when I insert an SD card into SD card reader, only for the插入和移除 SD 卡 reader 本身。
我一直用来做实验的 class 是:
namespace eventTest
{
class WMIReceiveEvent
{
static void Main(string[] args)
{
WMIReceiveEvent receiveEvent = new WMIReceiveEvent();
Console.Read();
}
public WMIReceiveEvent()
{
try
{
ManagementScope scope = new ManagementScope("root\CIMV2");
scope.Options.EnablePrivileges = true;
WqlEventQuery query = new WqlEventQuery("select * from Win32_DeviceChangeEvent");
ManagementEventWatcher watcher = new ManagementEventWatcher(scope, query);
Console.WriteLine("Waiting for an event...");
watcher.EventArrived += new EventArrivedEventHandler(HandleEvent);
// Start listening for events
watcher.Start();
}
catch (ManagementException err)
{
Console.WriteLine("An error occurred while trying to receive an event: " + err.Message);
}
}
private void HandleEvent(object sender,
EventArrivedEventArgs e)
{
Console.WriteLine(e.NewEvent.GetPropertyValue("EventType"));
}
}
}
任何人都可以向我们提供一个查询,我可以用它来监控 SD 卡到达 Windows 或者指出为什么 Win32_VolumeChangeEvent 不被接受为有效的 [=24] =] 如果固定的话,如何使用它来监控实际 SD 卡的到达?
以下代码是我的问题的有效解决方案,当 SD 卡进入 USB 连接的 SD 卡时我会收到通知 reader。查询是
SELECT * FROM __InstanceOperationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.Size > 0 AND TargetInstance.Description = "Removable disk"
选择大小 > 0 且涉及可移动驱动器的逻辑磁盘上的所有操作。可以进一步区分操作类型(插入和移除)并检索插入的 SD 卡的驱动器号。 (示例见 this Whosebug question )
编辑:插入时触发的事件似乎是一个“__InstanceModificationEvent”,可以用来代替 __InstanceOperationEvent(__InstanceModificationEvent 是 [=23= 的子类]),在这种情况下查询是:
SELECT * FROM __InstanceModificationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.Size > 0 AND TargetInstance.Description = "Removable disk"
完整示例:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Management;
using System.Threading;
namespace eventTest
{
class WMIReceiveEvent
{
static void Main(string[] args)
{
WMIReceiveEvent receiveEvent = new WMIReceiveEvent();
Console.Read();
}
public WMIReceiveEvent()
{
try
{
ManagementScope scope = new ManagementScope("root\CIMV2");
scope.Options.EnablePrivileges = true;
WqlEventQuery query = new WqlEventQuery("SELECT * FROM __InstanceModificationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.Size > 0 AND TargetInstance.Description = \"Removable disk\"");
ManagementEventWatcher watcher = new ManagementEventWatcher(scope, query);
Console.WriteLine("Waiting for an event...");
watcher.EventArrived += new EventArrivedEventHandler(HandleEvent);
// Start listening for events
watcher.Start();
}
catch (ManagementException err)
{
Console.WriteLine("An error occurred while trying to receive an event: " + err.Message);
}
}
private void HandleEvent(object sender,
EventArrivedEventArgs e)
{
//ManagementBaseObject baseObject = (ManagementBaseObject)e.NewEvent;
// if (baseObject.ClassPath.ClassName.Equals("__InstanceCreationEvent"))
Console.WriteLine("A drive was connected");
//else if (baseObject.ClassPath.ClassName.Equals("__InstanceDeletionEvent"))
//Console.WriteLine("A drive was removed");
}
}
}