2011-03-11 5 views
10

मैं कुछ कोड जोड़ने और यूएसबी उपकरणों को हटाने का पता लगाता है कि लेखन किया गया है के कारण होता है, और मैं के लिए डिवाइस परिवर्तन सूचनाएं रजिस्टर करने के लिए निम्नलिखित WMI कोड का उपयोग किया है:WMI का उपयोग पहचान करने के लिए जो डिवाइस एक Win32_DeviceChangeEvent

watcher = new ManagementEventWatcher(query); 
watcher.EventArrived += new EventArrivedEventHandler(DeviceChangeEventReceived); 
watcher.Start(); 

void DeviceChangeEventReceived(object sender, EventArrivedEventArgs e) 
{ 
    foreach (PropertyData pd in e.NewEvent.Properties) 
    { 
     Log.Debug("\t" + pd.Name + ":" + pd.Value + "\t" + pd.Value.GetType()); 
    } 
} 

यह बहुत अच्छा है और सभी, यह किसी भी USB डिवाइस मैं में प्लग या सिस्टम से हटाने के लिए काम करता है: यह हैंडलर कोड है। मेरी समस्या यह है कि, मैं डिवाइस को कैसे पहचानूं जो विशेष रूप से घटनाओं का कारण बनता है?

मेरे कार्यक्रम में कहीं और, मैं वर्तमान में जुड़े हुए उपकरणों की एक सूची रख रहा हूं, जिसमें मुझे सबसे रूचि है, इसलिए यदि डिवाइस से हटाई गई घटना आती है, तो मैं Win32_PnPEntity से "select * का उपयोग करके WMI के विरुद्ध उस सूची को देख सकता हूं "या कुछ अन्य समान प्रश्न। लेकिन, यह हटाए गए डिवाइस की पहचान करने का एक बहुत ही गलत और बोझिल तरीका है। जोड़ा गया समस्या यह है कि, मेरे पास डिवाइस को जो भी जोड़ा गया था, उसे सटीक रूप से बताए जाने का कोई तरीका नहीं है, जब तक कि मैं समय से पहले Win32_PnPEntity की पूरी सूची को कैश नहीं करता, और वास्तव में पागल तुलना/सत्यापन करता हूं।

क्या मुझे यहां कुछ स्पष्ट याद आ रही है? मैं डिवाइस परिवर्तन घटनाओं को किसी विशिष्ट डिवाइस से कैसे जोड़ूं?

अद्यतन: मैं अभी भी इस समस्या के लिए एक आदर्श समाधान के साथ नहीं आया है, लेकिन मैं जो कर रहा हूं वह वर्तमान में जुड़े हुए डिवाइसों (जिसमें मुझे रूचि है) की सूची बनाए रखना है, और हर बार एक घटना संभाला जाता है (ऊपर देखें), मैं Win32_PnPEntity से यह पूछता हूं कि मेरे कनेक्टेड डिवाइस सूची में संग्रहीत डिवाइस अभी भी जुड़े हुए हैं या नहीं। यह एक उप-इष्टतम समाधान है, क्योंकि यह अजीब लगता है कि मुझे "डिवाइस परिवर्तन ईवेंट" इंगित करने वाली घटना से कोई विशिष्ट डिवाइस पहचान जानकारी नहीं मिल सकती है। बहुत अजीब लगता है, कि यह जानकारी अनुपलब्ध है। आह

उत्तर

15

ठीक है, तो कुछ आगे की जांच पड़ताल और प्रयोग करने के बाद, मुझे पता चला है कि मैं अपने समस्या, किसी विशिष्ट उपकरण में एक डिवाइस परिवर्तन घटना संबद्ध करने के लिए है जो हल करने के लिए एक अलग WMI क्वेरी का उपयोग करने की आवश्यकता है। इस मामले में, मुझे "लक्ष्यीकरण" के रूप में डब्लूएमआई में परंपरागत रूप से संदर्भित होने की आवश्यकता है।

तो, मैं निम्नलिखित WMI क्वेरी कोड बजाय

  ManagementEventWatcher watcher; 
      string queryStr = 
       "SELECT * FROM __InstanceCreationEvent " + 
       "WITHIN 2 " 
       + "WHERE TargetInstance ISA 'Win32_PnPEntity'" 

      watcher = new ManagementEventWatcher(queryStr); 
      watcher.EventArrived += new EventArrivedEventHandler(DeviceChangeEventReceived); 
      watcher.Start(); 

तो अंतर यहाँ है इस्तेमाल किया, कि __InstanceCreationEvent एक संपत्ति "TargetInstance" कहा जाता है, जो मैं वास्तव में क्या देख रहा था है। मैंने TargetInstance प्रॉपर्टी को एक प्रबंधनबेसऑबजेक्ट (जो कि "Win32_PnPEntity" (उपर्युक्त क्वेरी में आईएसए क्लॉज के अनुसार) है, और वोला! मुझे विशिष्ट डिवाइस मिलता है जो बनाया गया था।

यह अभी भी मुझे परेशान करता है मेरी मूल क्वेरी "Win32_DeviceChangeEvent से * चुनें * कैसे किसी के लिए उपयोगी होगी, क्योंकि सामान्य घटना अधिसूचना समाप्त होने के बाद प्रदान की गई कोई अतिरिक्त जानकारी नहीं है। किसी भी तरह से, यह नई क्वेरी मेरी समस्या के लिए एक महत्वपूर्ण क्लीनर समाधान है। WMI लगता है बहुत शक्तिशाली, लेकिन उपयोग करने के लिए सही क्वेरी ढूंढना मुश्किल हो सकता है, और कुछ प्रयोग करने की आवश्यकता है।

+1

यह अच्छा जवाब वास्तव में काम करता है, लेकिन दुर्भाग्यवश एक नकारात्मक पक्ष है। उपयोगकर्ताओं को पता होना चाहिए कि यह ** _ मतदान _ ** क्वेरी है (संकेत "भीतर 2" है, और "भीतर" विकल्प नहीं है इस प्रश्न के लिए एल)। इसके लिए सीपीयू को लगातार मतदान करने की आवश्यकता होती है, और इसे एक महत्वपूर्ण सीपीयू लोड के रूप में देखा जा सकता है (मेरे परीक्षण में, क्वाड कोर सिस्टम पर लगभग ~ 5%, इसलिए वास्तव में एक कोर के लगभग 20%, दो प्रश्नों के साथ "1 के भीतर" ") WmiPrvSE.exe सेवा में। ये घटनाएं आश्चर्यजनक रूप से नहीं आतीं, संबंधित Win32_DeviceChangeEvent के लगभग 1-2 सेकंड बाद, इसलिए रिपोर्टिंग में एक महत्वपूर्ण देरी हुई है। – dale

संबंधित मुद्दे