0

私のアプリケーションでは、ペンドライブのアタッチおよびデタッチイベントでイベントを発生させたいと考えています。次のコードを使用してイベントを発生させました。

private ManagementEventWatcher watcherAttach;

private ManagementEventWatcher watcherRemove;        

watcherAttach = new ManagementEventWatcher();
watcherAttach.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
watcherAttach.Query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
watcherAttach.Start();


watcherRemove = new ManagementEventWatcher();
watcherRemove.EventArrived += new EventArrivedEventHandler(watcher_EventRemoved);
watcherRemove.Query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 3");
watcherRemove.Start();


// this are events
void watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
     // code to execute
}

void watcher_EventRemoved(object sender, EventArrivedEventArgs e)
{
   //code to execute
}

しかし問題は、両方のイベントが 2 回発生し、コードが両方のイベントで完全に実行されないことです。これを克服する方法を教えてもらえますか?

4

1 に答える 1

0

最も簡単な方法は、イベントの登録を解除してから、自分の仕事をして再度登録することだと思います。サブスクリプションを解除したときに他のデバイスが接続される可能性はわずかです。キーボードで2回のキーストロークを処理するときも、同様の方法で行いました。

// this are events
void watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
watcherAttach.EventArrived -= new EventArrivedEventHandler(watcher_EventArrived);
     // code to execute
watcherAttach.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
}

void watcher_EventRemoved(object sender, EventArrivedEventArgs e)
{
watcherRemove.EventArrived -= new EventArrivedEventHandler(watcher_EventRemoved);
   //code to execute
watcherRemove.EventArrived += new EventArrivedEventHandler(watcher_EventRemoved);
}
于 2012-12-24T12:07:06.733 に答える