मुझे नहीं पता कि आप प्रोग्रामिंग के बिना यह कैसे कर सकते हैं, लेकिन मैंने एप्लिकेशन लिखे हैं जो वास्तव में आप चाहते हैं। तो यहां इसे कैसे लागू किया जाए।
जब एक नया डिवाइस सिस्टम में जोड़ा जाता है (जैसे 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 ) );
}
}
}