.net C WMI中的软盘噪音-Win32_LogicalDisk类
我正在尝试使用WMI跟踪Windows上的USB设备插入和CD/DVD插入。然而,当我使用Win32_LogicalDisk类跟踪这些事件时,软盘开始发出噪音 我的问题如下。第一个用于USB,第二个用于CD.net C WMI中的软盘噪音-Win32_LogicalDisk类,.net,winapi,wmi,floppy,.net,Winapi,Wmi,Floppy,我正在尝试使用WMI跟踪Windows上的USB设备插入和CD/DVD插入。然而,当我使用Win32_LogicalDisk类跟踪这些事件时,软盘开始发出噪音 我的问题如下。第一个用于USB,第二个用于CD q = gcnew WqlEventQuery(); q->EventClassName = "__InstanceCreationEvent"; q->WithinInterval = TimeSpan(0, 0, 3); q->Condition = "TargetIn
q = gcnew WqlEventQuery();
q->EventClassName = "__InstanceCreationEvent";
q->WithinInterval = TimeSpan(0, 0, 3);
q->Condition = "TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.DriveType = 2 and TargetInstance.DeviceID <> 'A:' and TargetInstance.DeviceID <> 'B:'";
w = gcnew ManagementEventWatcher(scope, q);
w->EventArrived += gcnew EventArrivedEventHandler(USBAdded);
w->Start();
实际上,它并不是在所有版本上都发出噪音。任何想法都将不胜感激 根据Microsoft WMI支持消息,我不确定Win32_LogicalDisk上的WMI查询是否能够在每个轮询间隔内运行而不触发触发器。我正试图找到一种自己解决这个问题的替代方法;当我在托管代码中工作时,我考虑只运行一个计时器并通过DriveInfo.GetDrives枚举可用的驱动器
更新:当我在Windows服务中执行此操作时,已经按照本文中描述的方式实现了一个消息处理程序,但是通过适当的异常处理和非托管内存清理,我只是为DBT_DEVICEARRIVAL和DBT_DeviceMoveComplete消息添加了处理程序。感谢你把那篇文章指给我看。我在处理程序中使用DriveInfo.GetDrives来确定插入或删除了哪些设备,因为我发现这比通过Win32获取驱动器号更干净、更简单。没有定期轮询,没有混乱的WMI,驱动器A现在保持良好和安静。我已经从WMI创建了一种新方法
void MyDLPWMIDeviceListener::AddInsertUSBHandler()
{
WqlEventQuery ^q;
ManagementEventWatcher ^w;
ManagementScope ^scope = gcnew ManagementScope("root\\CIMV2");
scope->Options->EnablePrivileges = true;
try
{
q = gcnew WqlEventQuery();
q->EventClassName = "__InstanceCreationEvent";
q->WithinInterval = TimeSpan(0, 0, 3);
q->Condition = "TargetInstance ISA 'Win32_USBControllerDevice'";
w = gcnew ManagementEventWatcher(scope, q);
w->EventArrived += gcnew EventArrivedEventHandler(USBAdded);
w->Start();
}
catch (Exception ^ex)
{
if (w != nullptr)
w->Stop();
}
}
之后,我处理了生成的事件,如下所示:
void MyDLPWMIDeviceListener::USBAdded(Object ^sender, EventArrivedEventArgs ^e)
{
try {
PropertyData ^pd = e->NewEvent->Properties["TargetInstance"];
if (pd != nullptr)
{
ManagementBaseObject ^mbo = dynamic_cast<ManagementBaseObject ^>(pd->Value);
if(mbo != nullptr && mbo->Properties["Dependent"] != nullptr
&& mbo->Properties["Dependent"]->Value != nullptr) {
String ^str = (String ^)mbo->Properties["Dependent"]->Value;
str = str->Replace("\"","");
String ^splitChar = "=";
array<String ^> ^strArr = str->Split(splitChar->ToCharArray());
WqlObjectQuery ^wqlQuery = gcnew WqlObjectQuery("Select * from Win32_PnPEntity where DeviceID = '"+strArr[1]+"'");
ManagementObjectSearcher ^searcher = gcnew ManagementObjectSearcher(wqlQuery);
for each (ManagementObject ^usbCont in searcher->Get()) {
String ^pnpDeviceID = (String ^)usbCont->Properties["PNPDeviceID"]->Value;
splitChar = "\\";
array<String ^> ^pnpDeviceIDArr = pnpDeviceID->Split(splitChar->ToCharArray());
if(pnpDeviceIDArr->Length == 3) {
if(pnpDeviceIDArr[0] == "USB") {
WqlObjectQuery ^wqlQueryDisk = gcnew WqlObjectQuery("Select * from Win32_DiskDrive where PNPDeviceID LIKE '%"+pnpDeviceIDArr[2]+"%'");
ManagementObjectSearcher ^searcherDisk = gcnew ManagementObjectSearcher(wqlQueryDisk);
ManagementObjectCollection ^collectionDisk = searcherDisk->Get();
if(collectionDisk->Count == 0)
continue;
else if (collectionDisk->Count == 1) {
for each (ManagementObject ^disk in collectionDisk) {
}
}
else {
return;
}
} else {
return;
}
} else {
return;
}
}
}
}
} catch (Exception ^ex) {
}
}
问题1:你为什么不把软盘从盒子里撕下来,然后发射到太空?我的日历上写着2011年。请给出建议。也许你应该把你的软盘卖给博物馆:我建议在你的查询中不要使用a:和B:因为在没有软盘驱动器的计算机上,这些字母可以手动分配给可移动设备和映射网络驱动器。同意扔掉软盘:…还找不到方法。。在某些电脑上,它会发出“tttrrtt”的声音,而在其他电脑上则不会。
void MyDLPWMIDeviceListener::USBAdded(Object ^sender, EventArrivedEventArgs ^e)
{
try {
PropertyData ^pd = e->NewEvent->Properties["TargetInstance"];
if (pd != nullptr)
{
ManagementBaseObject ^mbo = dynamic_cast<ManagementBaseObject ^>(pd->Value);
if(mbo != nullptr && mbo->Properties["Dependent"] != nullptr
&& mbo->Properties["Dependent"]->Value != nullptr) {
String ^str = (String ^)mbo->Properties["Dependent"]->Value;
str = str->Replace("\"","");
String ^splitChar = "=";
array<String ^> ^strArr = str->Split(splitChar->ToCharArray());
WqlObjectQuery ^wqlQuery = gcnew WqlObjectQuery("Select * from Win32_PnPEntity where DeviceID = '"+strArr[1]+"'");
ManagementObjectSearcher ^searcher = gcnew ManagementObjectSearcher(wqlQuery);
for each (ManagementObject ^usbCont in searcher->Get()) {
String ^pnpDeviceID = (String ^)usbCont->Properties["PNPDeviceID"]->Value;
splitChar = "\\";
array<String ^> ^pnpDeviceIDArr = pnpDeviceID->Split(splitChar->ToCharArray());
if(pnpDeviceIDArr->Length == 3) {
if(pnpDeviceIDArr[0] == "USB") {
WqlObjectQuery ^wqlQueryDisk = gcnew WqlObjectQuery("Select * from Win32_DiskDrive where PNPDeviceID LIKE '%"+pnpDeviceIDArr[2]+"%'");
ManagementObjectSearcher ^searcherDisk = gcnew ManagementObjectSearcher(wqlQueryDisk);
ManagementObjectCollection ^collectionDisk = searcherDisk->Get();
if(collectionDisk->Count == 0)
continue;
else if (collectionDisk->Count == 1) {
for each (ManagementObject ^disk in collectionDisk) {
}
}
else {
return;
}
} else {
return;
}
} else {
return;
}
}
}
}
} catch (Exception ^ex) {
}
}