USB डिवाइस को जोड़ने पर एक कार्रवाई शुरू करें [डुप्लिकेट]


1

इस सवाल का पहले से ही यहाँ एक जवाब है:

मैं एक एप्लिकेशन शुरू करने का प्रयास करता हूं, जब एक विशेष यूएसबी डिवाइस जोड़ा जाता है।

विंडोज इवेंट सिस्टम में मैं इवेंट का उपयोग कर सकता हूं: Microsoft-Windows-DriverFrameworks-UserMode->Event ID: 2100

यह ईवेंट तब उठाया जाता है, जब कोई नया उपकरण जोड़ा जाता है। यह ठीक काम करता है, लेकिन मुझे पता चलेगा कि किस ड्राइव को जोड़ा गया था।

इवेंट सिस्टम में मैंने पाया, कि अतिरिक्त जानकारी उपलब्ध है, लेकिन मैं इस जानकारी का उपयोग कैसे कर सकता हूं?

क्या यह जानकारी प्राप्त करना संभव है, किस ड्राइव को जोड़ा गया था? या क्या ईवेंट सिस्टम के अतिरिक्त डेटा को उपयोगकर्ता प्रोग्राम (कमांड लाइन पैरामीटर) पर सौंपना संभव है?

जवाबों:


3

मुझे नहीं पता कि आप प्रोग्रामिंग के बिना यह कैसे कर सकते हैं, लेकिन मैंने एप्लिकेशन लिखे हैं जो वास्तव में आप चाहते हैं। तो यहां इसे कैसे लागू किया जाए।

जब एक नया डिवाइस सिस्टम में जोड़ा जाता है (जैसे USB ड्राइव), तो विंडोज WM_DEVICECHANGEसभी टॉप-लेवल एप्लिकेशन विंडो को संदेश भेजता है । देखने की घटना है DBT_DEVICEARRIVAL(जो wParamउस संदेश के माध्यम से इंगित की गई है)।

lParamसंदेश के पहले एक के रूप में व्यवहार किया जाना चाहिए DEV_BROADCAST_HDRdbch_devicetypeयदि डिवाइस वास्तव में वॉल्यूम है ( DBT_DEVTYP_VOLUME) तो हेडर इंगित करेगा (इसके सदस्य के माध्यम से )। यदि यह एक वॉल्यूम है, तो आप lParamमूल संदेश को एक के रूप में पुन: व्याख्या कर सकते हैं DEV_BROADCAST_VOLUME। यह संरचना तब निर्दिष्ट ड्राइव अक्षर को dbcv_unitmaskसदस्य के माध्यम से इंगित करेगी ।

इसे (स्पष्ट रूप से) थोड़ा स्पष्ट करने के लिए, C # में खान के कार्यान्वयन से कुछ कार्य कोड यहां दिए गए हैं:

private static void MessageEventsMessageReceived( object sender, MessageReceivedEventArgs e ) {
  // Check if this is a notification regarding a new device.);
  if( e.Message.WParam == (IntPtr)NativeMethods.DBT_DEVICEARRIVAL ) {
    Log.Info( "New device has arrived" );

    // Retrieve the device broadcast header
    NativeMethods.DEV_BROADCAST_HDR deviceBroadcastHeader =
      (NativeMethods.DEV_BROADCAST_HDR)
      Marshal.PtrToStructure( e.Message.LParam, typeof( NativeMethods.DEV_BROADCAST_HDR ) );

    if( (int)NativeMethods.DBT_DEVTYP.DBT_DEVTYP_VOLUME == deviceBroadcastHeader.dbch_devicetype ) {
      Log.Info( "Device type is a volume (good)." );

      NativeMethods.DEV_BROADCAST_VOLUME volumeBroadcast =
        (NativeMethods.DEV_BROADCAST_VOLUME)
        Marshal.PtrToStructure( e.Message.LParam, typeof( NativeMethods.DEV_BROADCAST_VOLUME ) );

      Log.InfoFormat( "Unit masked for new device is: {0}", volumeBroadcast.dbcv_unitmask );

      int driveIndex = 1;
      int bitCount = 1;
      while( bitCount <= 0x2000000 ) {
        driveIndex++;
        bitCount *= 2;

        if( ( bitCount & volumeBroadcast.dbcv_unitmask ) != 0 ) {
          Log.InfoFormat( "Drive index {0} is set in unit mask.", driveIndex );
          Log.InfoFormat( "Device provides drive: {0}:", (char)( driveIndex + 64 ) );

          int index = driveIndex;
          char driveLetter = (char)( driveIndex + 64 );
          // Do something with driveLetter

        }
      }

    } else {
      Log.InfoFormat( "Device type is {0} (ignored).", Enum.GetName( typeof( NativeMethods.DBT_DEVTYP ), deviceBroadcastHeader.dbch_devicetype ) );
    }
  }
}

धन्यवाद 'बहुत तेजी से जवाब के लिए, मैं अपने उपयोग के लिए यह जाँच करूँगा। वैसे: मैंने विशेष विंडोज़ घटना प्रणाली के आधार पर अनुसूचक से एक आवेदन शुरू करने की कोशिश की। इस एप्लिकेशन के भीतर मैंने इवेंट सिस्टम के मापदंडों को संभालने की कोशिश की। तो आप पूरी तरह से सही हैं: एक कोडिंग करने की आवश्यकता है। हमारा एक अलग दृष्टिकोण था। आप एप्लिकेशन हमेशा चल रहे हैं और आप विंडोज़ ईवेंट को पकड़ रहे हैं। मैंने अपना कार्यक्रम विंडोज़ शेड्यूलर द्वारा चालू करने का प्रयास किया।
user263387
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.