मुझे नहीं पता कि आप प्रोग्रामिंग के बिना यह कैसे कर सकते हैं, लेकिन मैंने एप्लिकेशन लिखे हैं जो वास्तव में आप चाहते हैं। तो यहां इसे कैसे लागू किया जाए।
जब एक नया डिवाइस सिस्टम में जोड़ा जाता है (जैसे USB ड्राइव), तो विंडोज WM_DEVICECHANGEसभी टॉप-लेवल एप्लिकेशन विंडो को संदेश भेजता है । देखने की घटना है DBT_DEVICEARRIVAL(जो wParamउस संदेश के माध्यम से इंगित की गई है)।
lParamसंदेश के पहले एक के रूप में व्यवहार किया जाना चाहिए DEV_BROADCAST_HDR। dbch_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 ) );
}
}
}