MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Автоматическое появление кнопки при подключении флешки/дискового раздела"
Answer 652517
Windows на ура рассылает всем окнам верхнего уровня сообщения об изменении состоянии устройств. Успевайте только ловить (ну и отфильтровывать лишнее). Вас интересует сообщение WM_DEVICECHANGE с событиями DBT_DEVICEARRIVAL и DBT_DEVICEREMOVECOMPLETE, возникающее для типа устройств DBT_DEVTYPE_VOLUME.
Добавьте следующий код в любое окно верхнего уровня (не имеющее родителя):
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.IO; namespace DeviceTest { public partial class Form1 : Form { /*WINAPI constants*/ const int WM_DEVICECHANGE = 0x219; const int DBT_DEVICEARRIVAL = 0x8000; const int DBT_DEVICEREMOVECOMPLETE = 0x8004; const int DBT_DEVTYP_VOLUME = 0x00000002; public Form1() { InitializeComponent(); PrintDrives(); } /// <summary> /// Вывести список дисков в textbox /// </summary> public void PrintDrives() { DriveInfo[] allDrives = DriveInfo.GetDrives(); StringBuilder sb = new StringBuilder(255); foreach (DriveInfo d in allDrives) { sb.Append(d.Name);//это буква диска sb.Append(" ("+ d.DriveType.ToString()+")"); if (d.IsReady == true) { sb.Append(" - "+ d.VolumeLabel);//метка диска sb.Append(", "+ d.DriveFormat);//файловая система } else sb.Append(" [not ready]"); sb.AppendLine(); } tbDrives.Text = sb.ToString(); } protected override void WndProc(ref Message m) { DEV_BROADCAST_HDR pHdr; switch (m.Msg) { case WM_DEVICECHANGE: switch ((int)m.WParam) { case DBT_DEVICEARRIVAL://устройство подключено pHdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR)); if (pHdr.dbch_devicetype == DBT_DEVTYP_VOLUME) { tbLog.Text+=Environment.NewLine+DateTime.Now.ToString()+" :"+"Volume was inserted"; PrintDrives(); } break; case DBT_DEVICEREMOVECOMPLETE://устройство отключено pHdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR)); if (pHdr.dbch_devicetype == DBT_DEVTYP_VOLUME) { tbLog.Text += Environment.NewLine + DateTime.Now.ToString() + " :" + "Volume was removed"; PrintDrives(); } break; } break; } base.WndProc(ref m); } } public struct DEV_BROADCAST_HDR { public int dbch_size; public int dbch_devicetype; public int dbch_reserved; } }
Только учтите, что в код обработки данных сообщений нельзя вписывать длительные операции, так как система ждет их обработки всеми окнами и соответственно это может привести к подвисанию системы.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.