C#.NET 隨身碟插拔監控

來源:互聯網
上載者:User

標籤:u盤   .net   硬體   usb   

【1】涉及的知識點

1) windows訊息處理函數

protected override void WndProc(ref Message m)


捕獲Message的系統硬體改變發出的系統訊息


2) 硬體資訊類

DriveInfo

【2】核心函數

訊息常量:

/// <summary>/// windows訊息常量/// </summary>class CWndProMsgConst{    public const int WM_DEVICECHANGE = 0x219; // 系統硬體改變發出的系統訊息    public const int DBT_DEVICEARRIVAL = 0x8000;// 裝置檢測結束,並且可以使用    public const int DBT_CONFIGCHANGECANCELED = 0x0019;    public const int DBT_CONFIGCHANGED = 0x0018;    public const int DBT_CUSTOMEVENT = 0x8006;    public const int DBT_DEVICEQUERYREMOVE = 0x8001;    public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;    public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;// 裝置卸載或者拔出    public const int DBT_DEVICEREMOVEPENDING = 0x8003;    public const int DBT_DEVICETYPEHANGED = 0x0007;    public const int DBT_QUERYCHANGSPECIFIC = 0x8005;    public const int DBT_DEVNODES_CECONFIG = 0x0017;    public const int DBT_USERDEFINED = 0xFFFF;}    

掃描函數:

        /// <summary>        /// 掃描U口裝置        /// </summary>        private void ScanUSBDisk()        {            _usbdiskList.Clear();            DriveInfo[] drives = DriveInfo.GetDrives();            foreach (DriveInfo drive in drives)            {                if ((drive.DriveType == DriveType.Removable) && !drive.Name.Substring(0, 1).Equals("A"))                {                    try                    {                        _usbdiskList.Add(drive.Name);                    }                    catch                    {                        MessageBox.Show("當前盤不能正確識別,請重新嘗試!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);                    }                }            }        }

訊息處理函數:

        public void FillData(Form form, Message m, ListBox listbox)        {            _listbox = listbox;            _form    = form;            try            {                if (m.Msg == CWndProMsgConst.WM_DEVICECHANGE) // 系統硬體改變發出的系統訊息                {                    switch (m.WParam.ToInt32())                    {                        case CWndProMsgConst.WM_DEVICECHANGE:                            break;                        //裝置檢測結束,並且可以使用                        case CWndProMsgConst.DBT_DEVICEARRIVAL:                            {                                ScanUSBDisk();                                _listbox.Items.Clear();                                foreach (string str in _usbdiskList)                                {                                    _listbox.Items.Add(str);                                }                                                            }                            break;                        // 裝置卸載或者拔出                        case CWndProMsgConst.DBT_DEVICEREMOVECOMPLETE:                            {                                ScanUSBDisk();                                _listbox.Items.Clear();                                foreach (string str in _usbdiskList)                                {                                    _listbox.Items.Add(str);                                }                            }                                                       break;                        default:                            break;                    }                }            }            catch (Exception ex)            {                MessageBox.Show("當前盤不能正確識別,請重新嘗試!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);            }        }           

完整的CS封裝檔案:

using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;using System.Threading;using System.IO;namespace USBMonitor{    /// <summary>    /// USB插拔監控類    /// </summary>    public class CUSBMonitor    {        private delegate void SetTextCallback(string s);        private IList<string> _usbdiskList = new List<string>();        private ListBox _listbox = null;        private Form    _form  = null;        public CUSBMonitor()        {            System.Timers.Timer timer = new System.Timers.Timer(1000);            timer.Enabled = true;            // 達到間隔時發生            timer.Elapsed += new System.Timers.ElapsedEventHandler(TimerList);            timer.AutoReset = false; // 僅在間隔第一次結束後引發一次                  }        public void FillData(Form form, Message m, ListBox listbox)        {            _listbox = listbox;            _form    = form;            try            {                if (m.Msg == CWndProMsgConst.WM_DEVICECHANGE) // 系統硬體改變發出的系統訊息                {                    switch (m.WParam.ToInt32())                    {                        case CWndProMsgConst.WM_DEVICECHANGE:                            break;                        //裝置檢測結束,並且可以使用                        case CWndProMsgConst.DBT_DEVICEARRIVAL:                            {                                ScanUSBDisk();                                _listbox.Items.Clear();                                foreach (string str in _usbdiskList)                                {                                    _listbox.Items.Add(str);                                }                                                            }                            break;                        // 裝置卸載或者拔出                        case CWndProMsgConst.DBT_DEVICEREMOVECOMPLETE:                            {                                ScanUSBDisk();                                _listbox.Items.Clear();                                foreach (string str in _usbdiskList)                                {                                    _listbox.Items.Add(str);                                }                            }                                                       break;                        default:                            break;                    }                }            }            catch (Exception ex)            {                MessageBox.Show("當前盤不能正確識別,請重新嘗試!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);            }        }                   /// <summary>        /// 設定USB列表        /// </summary>        void TimerList(object sender, System.Timers.ElapsedEventArgs e)        {            ScanUSBDisk();            foreach (string str in _usbdiskList)            {                SetText(str);            }        }        /// <summary>        /// 掃描U口裝置        /// </summary>        private void ScanUSBDisk()        {            _usbdiskList.Clear();            DriveInfo[] drives = DriveInfo.GetDrives();            foreach (DriveInfo drive in drives)            {                if ((drive.DriveType == DriveType.Removable) && !drive.Name.Substring(0, 1).Equals("A"))                {                    try                    {                        _usbdiskList.Add(drive.Name);                    }                    catch                    {                        MessageBox.Show("當前盤不能正確識別,請重新嘗試!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);                    }                }            }        }        /// <summary>        /// 設定List列表        /// </summary>        /// <param name="text">名稱</param>        public void SetText(string text)        {            if (_listbox == null)                return;            if (this._listbox.InvokeRequired) // 調用方位於建立控制項所在的線程以外的線程中            {                if (_listbox.Items.Contains(text))                    return;                SetTextCallback d = new SetTextCallback(SetText);                _form.Invoke(d, new object[] { text });            }            else            {                if (_listbox.Items.Contains(text))                    return;                this._listbox.Items.Add(text);            }        }    }    /// <summary>    /// windows訊息常量    /// </summary>    class CWndProMsgConst    {        public const int WM_DEVICECHANGE = 0x219; // 系統硬體改變發出的系統訊息        public const int DBT_DEVICEARRIVAL = 0x8000;// 裝置檢測結束,並且可以使用        public const int DBT_CONFIGCHANGECANCELED = 0x0019;        public const int DBT_CONFIGCHANGED = 0x0018;        public const int DBT_CUSTOMEVENT = 0x8006;        public const int DBT_DEVICEQUERYREMOVE = 0x8001;        public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;        public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;// 裝置卸載或者拔出        public const int DBT_DEVICEREMOVEPENDING = 0x8003;        public const int DBT_DEVICETYPEHANGED = 0x0007;        public const int DBT_QUERYCHANGSPECIFIC = 0x8005;        public const int DBT_DEVNODES_CECONFIG = 0x0017;        public const int DBT_USERDEFINED = 0xFFFF;    }    }

測試表單(重寫訊息函數):

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace USBMonitor{    public partial class Main : Form    {        public Main()        {            InitializeComponent();        }        CUSBMonitor usbMonitor = new CUSBMonitor();        protected override void WndProc(ref Message m)        {            usbMonitor.FillData(this, m, _listBox);            base.WndProc(ref m);        }    }}


C#.NET 隨身碟插拔監控

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.