It seems that the spanish written post for unit detection is pretty popular between my readers (and particularly Google), so I thought that time had come to upgrade it for a more international language.
This piece of code basically consists in a couple of methods that can enable any application to detect whenever a new storage device has been inserted into the computer, whether it is a CD/DVD, an USB key, a SD/MMC memory card, a external HDD… and to identify the newly inserted device unit’s name. This methods can be modified to fit the requirements of an existent application, or to build a new one that can use this functionality en new and creative ways (such as automated backups of the data on our USB Keys when inserting them and viceversa).
//It IS mandatory to include this reference using System.Runtime.InteropServices; // // You can add any code you want… // HERE ….. // //Data structure that stores the connection management [StructLayout(LayoutKind.Sequential)] public struct DEV_BROADCAST_VOLUME { public int dbcv_size; public int dbcv_devicetype; public int dbcv_reserved; public int dbcv_unitmask; } //Method to overwrite that manages the arrival of new storage units protected override void WndProc(ref Message m) { //This definitions are stored in “dbt.h” and “winuser.h” // There has been a change in the devices const int WM_DEVICECHANGE = 0×0219; // System detects a new device const int DBT_DEVICEARRIVAL = 0×8000; // Device removal request const int DBT_DEVICEQUERYREMOVE = 0×8001; // Device removal failed const int DBT_DEVICEQUERYREMOVEFAILED = 0×8002; // Device removal is pending const int DBT_DEVICEREMOVEPENDING = 0×8003; // The device has been succesfully removed from the system const int DBT_DEVICEREMOVECOMPLETE = 0×8004; // Logical Volume (A disk has been inserted, such a usb key or external HDD) const int DBT_DEVTYP_VOLUME = 0×00000002; switch (m.Msg) { //If system devices change… case WM_DEVICECHANGE: switch (m.WParam.ToInt32()) { //If there is a new device… case DBT_DEVICEARRIVAL: { int devType = Marshal.ReadInt32(m.LParam, 4); //…and is a Logical Volume (A storage device) if (devType == DBT_DEVTYP_VOLUME) { DEV_BROADCAST_VOLUME vol; vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure( m.LParam, typeof(DEV_BROADCAST_VOLUME)); MessageBox.Show( ”A storage device has been inserted, unit: ” + UnitName(vol.dbcv_unitmask)); } } break; case DBT_DEVICEREMOVECOMPLETE: MessageBox.Show(”Device removed from system.”); break; } break; } //After the custom manager, we want to use the default system’s manager base.WndProc(ref m); } //Method to detect the unit name (”D:”, “F:”, etc) char UnitName(int unitmask) { char[] units ={ ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ’H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ’Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’ }; int i = 0; //Convert the mask in an array, and search //the index for the first occurrenc (the unit’s name) System.Collections.BitArray ba = new System.Collections.BitArray(System.BitConverter.GetBytes(unitmask)); foreach (bool var in ba) { if (var == true) break; i++; } return units[i]; }
I’d be really pleased to know if this was useful 🙂
viernes, 18 abril, 2008 a las 9:39 pm
Hi, I am student of El Salvador, I am working in a project with C#, I am looking for something that let me manage i/o
is that posible with C#?
domingo, 20 abril, 2008 a las 12:14 am
using System.IO; may be what you’re looking for. There are lots of documentation for all the classes there that are related with data streams, file management, etc.
martes, 24 febrero, 2009 a las 10:52 am
Where is the all full code source, please ??
Thanks
martes, 24 febrero, 2009 a las 11:02 am
That’s all you need to detect USB devices. Just paste the code and modify the WndProc method (the part where it spawns a MessageBox) and place there the code you need for the actions you want performed when the software detects the arrival of the new device xD