2012-02-27 2 views
2

USBデバイスが挿入/削除/有効/無効になったときに通知を受けたいとします。 Win32_USBControllerDeviceの "__InstanceOperationEvent"に登録しています。一部のデバイスを無効にすると__InstanceOperationEventを取得しない

問題は、すべてのデバイスの挿入/削除通知が表示されることです。 有効/無効イベントは、USBストレージデバイスに対してのみ取得されます。

私は間違っていますか?事前

答えて

2

おかげでコードのサンプルを提供するか、あなたが作業しているどの言語を告げずに、あなたが話しているかを把握するために少し難しい。

Win32_USBControllerクラスはWin32_PnPEntityの連想でありますタイプに関係なくすべてのUSBデバイスのインスタンスを持つクラス。したがって、このクラスの__InstanceOperationEventは、USBストレージデバイスだけでなく、すべてのデバイスの通知を提供します。より適切には、PnP互換のUSBデバイスであれば動作します。

次のスクリプトは、VBScriptで記述された概念です。デバイスの接続または切断時にすべてのUSBコンポーネントを通知します。私は、USBストレージデバイス、USBマウスとキーボード、および私が横たわっていた様々な他のデバイスでテストしました。それらのすべてが働いた。私はVista x64でテストしましたが、これはどのバージョンのWindowsでも動作します。

サンプル:

デバイスが有効になっているときに決定
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ステートメントにスローして、すべての可能な値を列挙できます。

サンプル:

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 
+0

ありがとうございます!私はすべてのUSBの挿入/削除の通知を取得します。一部のデバイスでは、無効/有効になったときにイベントが発生しません。 – user844541

+0

@ user844541デバイスを取り外さずに有効/無効を設定していますか?あなたは私にデバイスの例を教えてもらえますか?私はあなたがそのことによって何を意味しているのか分かりません。 – Nilpo

+0

例えばBelkin Wireless Network Adapterを考えてみましょう。デバイスが挿入されると、イベントが発生し、必要なものをすべて実行します。デバイスが無効になっていて、ユーザーがデバイスマネージャーを使用して有効にした場合は、イベントは発生しません。 – user844541

1

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) 
      { 
      } 
     } 
    } 
+0

ありがとう!私は一見するだろう。 – user844541

関連する問題