2014-01-20 4 views
1

모든 종류의 USB 장치에 대한 플러그인 및 플러그 아웃 이벤트를 감지하는 콘솔 응용 프로그램을 만들었습니다. 그러나 나는 웹캠 만 탐지하고 싶어하는 것처럼 필터링을 원했습니다. 이것은 GUID 클래스를 사용하여 수행되었습니다. 웹캠 클래스는 GUID "{6bdd1fc5-810f-11d0-bec7-08002be2092f}"를 가진 'Image'클래스입니다. 문제는이 'Image'클래스가 스캐너에 사용되며 스캐너를 감지하지 못하는 것입니다. 코드는 다음과 같습니다. 아래 : 나는 스캐너 다른 서비스이라는 속성이 있음을 발견 ManagementBaseObject의 모든 속성을 본 후,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(); 
     Console.ReadLine(); 
    } 

    static void m_mewWatcher_EventArrived(object sender, EventArrivedEventArgs e) 
    { 
     bool bUSBEvent = false; 
     string deviceCaption = ""; 
     string deviceType = ""; 

     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.Value); 
         if (pdDataSub.Name == "Caption") 
         { 
          deviceCaption = pdDataSub.Value.ToString(); 
         } 
         if (pdDataSub.Name == "ClassGuid" && pdDataSub.Value.ToString() == "{6bdd1fc5-810f-11d0-bec7-08002be2092f}") 
         { 
          bUSBEvent = true; 
          deviceType = "Image"; 
         } 
        } 
        if (bUSBEvent) 
        { 
         if (e.NewEvent.ClassPath.ClassName == "__InstanceCreationEvent") 
         { 
          Console.WriteLine("A " + deviceType + " device " + deviceCaption + " was plugged in at " + DateTime.Now.ToString()); 
         } 
         else if (e.NewEvent.ClassPath.ClassName == "__InstanceDeletionEvent") 
         { 
          Console.WriteLine("A " + deviceType + " device " + deviceCaption + " was plugged out at " + DateTime.Now.ToString()); 
         } 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
      } 
     } 
    } 

for references check this link

답변

1

나는 기다렸다하지만 몸은 그래서이 질문에 대답하지 않습니다. 스캐너에서 Service 속성의 값은 usbscan이고 카메라에서는 usbvideo입니다. 예. 이

if (mbo.Properties["Service"].Value.ToString() == "usbscan") 
{ 
//then it means it is a scanner 
} 
else 
{ 
//then it means it is a camera 
} 

메모와 같은 일을 수행 할 수 있습니다 주요 질문은 둘 다 동일한 GUID를 사용하기 때문에 우리가 어떻게 스캐너 및 웹캠을 구별 할 수 있었다.