USBデバイスが挿入/削除/有効/無効になったときに通知を受けたいとします。 Win32_USBControllerDeviceの "__InstanceOperationEvent"に登録しています。一部のデバイスを無効にすると__InstanceOperationEventを取得しない
問題は、すべてのデバイスの挿入/削除通知が表示されることです。 有効/無効イベントは、USBストレージデバイスに対してのみ取得されます。
私は間違っていますか?事前
USBデバイスが挿入/削除/有効/無効になったときに通知を受けたいとします。 Win32_USBControllerDeviceの "__InstanceOperationEvent"に登録しています。一部のデバイスを無効にすると__InstanceOperationEventを取得しない
問題は、すべてのデバイスの挿入/削除通知が表示されることです。 有効/無効イベントは、USBストレージデバイスに対してのみ取得されます。
私は間違っていますか?事前
で
おかげでコードのサンプルを提供するか、あなたが作業しているどの言語を告げずに、あなたが話しているかを把握するために少し難しい。
Win32_USBController
クラスはWin32_PnPEntityの連想でありますタイプに関係なくすべてのUSBデバイスのインスタンスを持つクラス。したがって、このクラスの__InstanceOperationEvent
は、USBストレージデバイスだけでなく、すべてのデバイスの通知を提供します。より適切には、PnP互換のUSBデバイスであれば動作します。
次のスクリプトは、VBScriptで記述された概念です。デバイスの接続または切断時にすべてのUSBコンポーネントを通知します。私は、USBストレージデバイス、USBマウスとキーボード、および私が横たわっていた様々な他のデバイスでテストしました。それらのすべてが働いた。私はVista x64でテストしましたが、これはどのバージョンのWindowsでも動作します。
vbscriptサンプル:
デバイスが有効になっているときに決定strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colEvents = objWMIService.ExecNotificationQuery _
("Select * From __InstanceOperationEvent Within 1 " _
& "Where TargetInstance Isa 'Win32_USBControllerDevice'")
While True
Set objEvent = colEvents.NextEvent
Select Case objEvent.Path_.Class
Case "__InstanceCreationEvent"
strOutput = "Device inserted:" & vbCr
Case "__InstanceDeletionEvent"
strOutput = "Device removed:" & vbCr
Case Default
strOutput = objEvent.Path_.Class & vbCr
End Select
strDeviceName = objEvent.TargetInstance.Dependent
strDeviceName = Replace(strDeviceName, Chr(34), "")
arrDevicePart = Split(strDeviceName, "=")
strDeviceName = arrDevicePart(1)
Set colUSBDevices = objWMIService.ExecQuery _
("Select * From Win32_PnPEntity Where DeviceID = '" & strDeviceName & "'")
For Each objUSBDevice in colUSBDevices
strOutput = strOutput & objUSBDevice.Description & vbCr
Next
WScript.Echo strOutput
Wend
または無効に似ていますが、いくつかの明確な違いがあります。あなたは基本的にすべてのインストールされたPnPデバイスの列挙であるWin32_PnPEntity
クラスを使いたいでしょう。各インスタンスのConfigManagerErrorCode
プロパティに注目したいと思うでしょう。これには、デバイスマネージャのデバイスステータス部分に表示される情報と同じ情報が含まれています。特定のデバイスに対してこの特性を見ることがなぜ有用なのかを知ることができます。デバイスが正常動作のためにコード(0)を示すように変更された場合、デバイスが有効になっていると安全に仮定できます。このコードがコード22に変更されると、デバイスが無効になっていることがわかります。 (その他のコードはすべてエラー状態を示します)__InstanceModificationEvent
は、Win32_PnPEntity
クラスのインスタンスの変更を監視するのに適しています。
可能性のあるエラーコードに興味がある場合は、スクリプトの冒頭のWScript.Echo
ステートメントにスローして、すべての可能な値を列挙できます。
vbscriptサンプル:
Const wbemFlagUseAmendedQualifiers = &H20000
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objPnPEntityClass = objWMIService.Get("Win32_PnPEntity", wbemFlagUseAmendedQualifiers)
arrValues = objPnPEntityClass.properties_("ConfigManagerErrorCode").qualifiers_("values")
valueMap = objPnPEntityClass.properties_("ConfigManagerErrorCode").qualifiers_("valuemap")
WScript.Echo "Gathering Device Manager error codes..."
Set dictErrorCodes = CreateObject("Scripting.Dictionary")
For i = 0 to Ubound(arrValues)
dictErrorCodes.add valueMap(i), arrValues(i)
' 0, This device is working properly.
' 22, This device is disabled.
Next
Set objPnPEntityClass = Nothing
WScript.Echo "Setting up event notification..."
Set colEvents = objWMIService.ExecNotificationQuery _
("Select * From __InstanceModificationEvent Within 1 " _
& "Where TargetInstance Isa 'Win32_PnPEntity'")
WScript.Echo "Waiting..."
While True
Set objEvent = colEvents.NextEvent
Set objDevice = objEvent.TargetInstance
Select Case objDevice.ConfigManagerErrorCode
Case 0 ' This device is working properly.
strOutput = objDevice.Caption & " is working properly." & vbCr
Case 22 ' This device is disabled.
strOutput = objDevice.Caption & " has been disabled." & vbCr
Case Default
strDeviceStatus = arrValues(objDevice.ConfigManagerErrorCode)
strOutput = "(" & objDevice.Caption & ") " & strDeviceStatus & vbCr
End Select
WScript.Echo strOutput
Wend
Win32_PnPEntityは本当に私のUSB指紋スキャナデバイスのために働きました。 ただし、ドライバがインストールされていないデバイスのイベントは選択されません。私のコードにも私のコードにいくつかの問題があるかもしれません。
static void Main(string[] args)
{
WqlEventQuery weqQuery = new WqlEventQuery();
weqQuery.EventClassName = "__InstanceOperationEvent";
weqQuery.WithinInterval = new TimeSpan(0, 0, 3);
weqQuery.Condition = @"TargetInstance ISA 'Win32_PnPEntity'";
ManagementEventWatcher m_mewWatcher = new ManagementEventWatcher(weqQuery);
m_mewWatcher.EventArrived += new EventArrivedEventHandler(m_mewWatcher_EventArrived);
m_mewWatcher.Start();
m_mewWatcher1.Start();
Console.ReadLine();
}
static void m_mewWatcher_EventArrived(object sender, EventArrivedEventArgs e)
{
bool bUSBEvent = false;
foreach (PropertyData pdData in e.NewEvent.Properties)
{
try
{
ManagementBaseObject mbo = (ManagementBaseObject)pdData.Value;
if (mbo != null)
{
foreach (PropertyData pdDataSub in mbo.Properties)
{
Console.WriteLine("pdDataSub.Name= " + pdDataSub.Name + " and pdDataSub.Value.ToString() = " + (pdDataSub.Value == null ? "" : pdDataSub.Value));
}
}
}
catch (Exception ex)
{
}
}
}
ありがとう!私は一見するだろう。 – user844541
ありがとうございます!私はすべてのUSBの挿入/削除の通知を取得します。一部のデバイスでは、無効/有効になったときにイベントが発生しません。 – user844541
@ user844541デバイスを取り外さずに有効/無効を設定していますか?あなたは私にデバイスの例を教えてもらえますか?私はあなたがそのことによって何を意味しているのか分かりません。 – Nilpo
例えばBelkin Wireless Network Adapterを考えてみましょう。デバイスが挿入されると、イベントが発生し、必要なものをすべて実行します。デバイスが無効になっていて、ユーザーがデバイスマネージャーを使用して有効にした場合は、イベントは発生しません。 – user844541