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