2009-05-19 20 views
0

次のC#コードを使用して、 USB大容量記憶装置の接続/削除イベントを検出しようとしています。私はWin32_VolumeChangeEventを使用しています。W32イベントWin32_VolumeChangeEventはWindows XPで動作します


// Initialize an event watcher and subscribe to events that match this query    
var _watcher = new ManagementEventWatcher("select * from Win32_VolumeChangeEvent"); 
_watcher.EventArrived += OnDeviceChanged; 
_watcher.Start(); 

void OnDeviceChanged(object sender, EventArrivedEventArgs args) 
{ 
    Console.WriteLine(args.NewEvent.GetText(TextFormat.Mof)); 
} 

問題は(何のイベントが受信されない)、これはVista上で正常に動作しますが、それはすべてのXPで動作しないということです。マイクロソフトのドキュメントによれば、これはうまくいくはずです(http://msdn.microsoft.com/en-us/library/aa394516(VS.85).aspx)。私はこれをかなりの間グーグルで見つけ出し、この問題もある他のものを見つけました。しかし、私はまた、この種のクエリ(主にvbscript)がXPで動作すると主張するいくつかの記事を発見しました。しかし、私はこの問題のためにマイクロソフトから公式な情報を見つけることはできません.3つのサービスパックでMicrosoftがこの問題を見落としているとは思えません。

私の質問は次のとおりです:XPで成功したWin32_VolumeChangeEventを誰かが使用したか、またはXP上で動作しない理由を説明するリンクを提供できますか?

答えて

0

あなた自身linkWin32_VolumeChangeEventの最小サポートされるクライアントのバージョンがWindows Vistaで読むことができたよう。とにかく、hereが示唆しているように、root\\CIMV2の範囲内の間隔内でクエリを実行できます。ここに私のコードの例があります:

WqlEventQuery query; 
ManagementScope scope; 
ManagementEventWatcher watcher; 
public void DoWork() 
{ 
    // Check if OS Version is earlier than Windows Vista 
    if (USBHandlerWorker.OSVersion() <= 6) 
    { 
     scope = new ManagementScope("root\\CIMV2"); 
     scope.Options.EnablePrivileges = true; 

     query = new WqlEventQuery(); 
     query.EventClassName = "__InstanceCreationEvent"; 
     query.WithinInterval = new TimeSpan(0, 0, 1); 
     query.Condition = @"TargetInstance ISA 'Win32_USBControllerdevice'"; 

     watcher = new ManagementEventWatcher(scope, query); 
     watcher.EventArrived += watcher_EventArrived; 
     watcher.Start(); 
    } 
    else 
    { 
     watcher = new ManagementEventWatcher(); 
     // The event types 2 and 3 are for plug and unplug events 
     query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent " + 
      "WHERE EventType = 2 OR EventType = 3"); 
     watcher.EventArrived += watcher_EventArrived; 
     watcher.Query = query; 
     watcher.Start(); 
    } 
} 
+0

私はこの質問を6年前に書いていましたが、文書には書かれていませんでしたが、今はそれです。とにかく、誰もまだWindows XPのために開発していないことを願っています;-) –

0

は "Win32_VolumeChangeEvent .. Windows Server 2003でのみ発見された" - source

関連する問題