`

U 盘加载,卸载,拔出,插入,WM_DEVICECHANGE,WndProc,DBT_DEVICEARRIVAL,DBT_DEVICEREMOVECOMPLE

阅读更多

最近在做一个和U盘有关的项目,有一个需求是要求显示插入的U盘的盘符,当然了,如果拔出U盘,也应该更新显示,就是显示U口上插入的全部移动设备的全部 盘符。

其实就是重写

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->protected   override   void  WndProc( ref  Message m)


方法,根据得到的系统消息来处理,但是如果要实时更新的话,最好加上定时查询U口设 备,将查询结果更新,时间的间隔可以自己定义,根据项目情况吧。
下面是完整的代码,如果大家有什么好的建议,欢迎大家一起交流。

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Text;
using  System.IO;
using  System.Windows.Forms;
using  System.Threading;

namespace  WindowsApp
{
    
public   partial   class  ComboBoxForm2 : Form
    {
        
private  IList < string >  diskList  =   new  List < string > ();

        
delegate   void  SetTextCallback( string  s);
        
delegate   void  ClearListBoxItem();

        
private  Thread thread  =   null ;
        
private  BackgroundWorker backgroundworker;

        
public  ComboBoxForm2()
        {
            InitializeComponent();
        }

        
protected   override   void  WndProc( ref  Message m)
        {
            
object  ojb  =   new   object ();
            
try
            {
                
// WM_DEVICECHANGE, 系统硬件改变发出的系统消息
                 if  (m.Msg  ==  WndProMsgConst.WM_DEVICECHANGE)
                {
                    
switch  (m.WParam.ToInt32())
                    {
                        
case  WndProMsgConst.WM_DEVICECHANGE:
                            
break ;
                        
// DBT_DEVICEARRIVAL, 设备检测结束,并且可以使用
                         case  WndProMsgConst.DBT_DEVICEARRIVAL:
                            scanUDisk();
                            listBox1.Items.Clear();
                           
foreach  ( string  s  in  diskList)
            {
                listBox1.Items.Add(s);
            }
                            
break ;
                        
// DBT_DEVICEREMOVECOMPLETE, 设备卸载或者拔出
                         case  WndProMsgConst.DBT_DEVICEREMOVECOMPLETE:
                            scanUDisk();
                            listBox1.Items.Clear();
                            
foreach  ( string  s  in  diskList)
                            {
                                listBox1.Items.Add(s);
                            }
                            
break ;
                       
                    }
                }
            }
            
catch  (Exception ex)
            {
                MessageBox.Show(
" 当前盘不能正确识别,请重新尝试! " " 提示 " , MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            
base .WndProc( ref  m);
        }
        
private   void  button1_Click( object  sender, EventArgs e)
        {
            IList
< string >  diskList  =   new  List < string > ();
            diskList.Add(
" k001 " );
            diskList.Add(
" k002 " );
            diskList.Add(
" k003 " );
            diskList.Add(
" k004 " );
            comboBox1.DataSource 
=  diskList;
        }
        
///   <summary>
        
///  扫描U 口设备
        
///   </summary>
        
///   <param name="obj"></param>
         private   void  scanUDisk()
        {
            diskList.Clear();
            DriveInfo[] drives 
=  DriveInfo.GetDrives();

            
foreach  (DriveInfo drive  in  drives)
            {
                
if  ((drive.DriveType  ==  DriveType.Removable)  &&   ! drive.Name.Substring( 0 1 ).Equals( " A " ))
                {
                    
try
                    {
                        diskList.Add(drive.Name);
                    }
                    
catch
                    {
                        MessageBox.Show(
" 当前盘不能正确识别,请重新尝试! " " 提示 " , MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }
            }
        }
        
private   void  ComboBoxForm2_Load( object  sender, EventArgs e)
        {
            System.Timers.Timer timer 
=   new  System.Timers.Timer( 1000 );
            timer.Enabled 
=   true ;
            timer.Elapsed 
+=   new  System.Timers.ElapsedEventHandler(fi);
            timer.AutoReset 
=   true ;

            
        }
       
        
private   void  ThreadProcSafe()
        {

            scanUDisk();
            
// MessageBox.Show(diskList.Count.ToString());

            
foreach  ( string  s  in  diskList)
            {
                SetText(s);
            }
        }
        
public   void  SetText( string  text)
        {
            
if  ( this .listBox1.InvokeRequired)
            {
                
if  (listBox1.Items.Contains(text))
                    
return ;
                SetTextCallback d 
=   new  SetTextCallback(SetText);
                
this .Invoke(d,  new   object [] { text });
            }
            
else
            {
                
if  (listBox1.Items.Contains(text))
                    
return ;
                
this .listBox1.Items.Add(text);
            }
        }
        
void  fi( object  sender, System.Timers.ElapsedEventArgs e)
        {
            scanUDisk();
            
// listBox1.Items.Clear();
             foreach  ( string  s  in  diskList)
            {
                SetText(s);
            }
        }
    }
    
///   <summary>
    
///  windows 消息的常量
    
///   </summary>
     class  WndProMsgConst
    {
        
#region  WndProc 常量
        
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_DEVICETYPESPECIFIC  =   0x8005 ;
        
public   const   int  DBT_DEVNODES_CHANGED  =   0x0007 ;
        
public   const   int  DBT_QUERYCHANGECONFIG  =   0x0017 ;
        
public   const   int  DBT_USERDEFINED  =   0xFFFF ;
        
#endregion
    }
}


设备的实时性还是差一点,还有啊, 像这样的窗体有很多,我不能每个窗体都copy一遍这些代码吧,如何封装起来呢,控件的线程安全也是问题,还需要改进啊,谁有好的意见可以提出来。

msn:jorden008@hotmail.com
mail:jorden008@163.com



简 单封装了一下,封装类如下:

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Windows.Forms;
using  System.Threading;
using  System.IO;

namespace  WindowsApp
{
    
class  Class1
    {
        
private  IList < string >  diskList  =   new  List < string > ();

        
delegate   void  SetTextCallback( string  s);
        
delegate   void  ClearListBoxItem();
        
private  ListBox _listbox;
        
private  Form _form;
        
private  Thread thread  =   null ;
        
// private BackgroundWorker backgroundworker;

        
public  Class1()
        {

            System.Timers.Timer timer 
=   new  System.Timers.Timer( 1000 );
            timer.Enabled 
=   true ;
            timer.Elapsed 
+=   new  System.Timers.ElapsedEventHandler(fi);
            timer.AutoReset 
=   true ;
        }
        
public   void  filldata(Form form, Message m,ListBox listbox)
        {
            _listbox 
=  listbox;
            _form 
=  form;
            
try
            {
                
// WM_DEVICECHANGE, 系统硬件改变发出的系统消息
                 if  (m.Msg  ==  WndProMsgConst.WM_DEVICECHANGE)
                {
                    
switch  (m.WParam.ToInt32())
                    {
                        
case  WndProMsgConst.WM_DEVICECHANGE:
                            
break ;
                        
// DBT_DEVICEARRIVAL, 设备检测结束,并且可以使用
                         case  WndProMsgConst.DBT_DEVICEARRIVAL:
                            scanUDisk();
                            _listbox.Items.Clear();
                            
foreach  ( string  s  in  diskList)
                            {
                                _listbox.Items.Add(s);
                            }
                            
break ;
                        
// DBT_DEVICEREMOVECOMPLETE, 设备卸载或者拔出
                         case  WndProMsgConst.DBT_DEVICEREMOVECOMPLETE:
                            scanUDisk();
                            _listbox.Items.Clear();
                            
foreach  ( string  s  in  diskList)
                            {
                                _listbox.Items.Add(s);
                            }
                            
break ;

                    }
                }
            }
            
catch  (Exception ex)
            {
                MessageBox.Show(
" 当前盘不能正确识别,请重新尝试! " " 提示 " , MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        
public   void  SetText( string  text)
        {
            
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);
            }
        }
        
void  fi( object  sender, System.Timers.ElapsedEventArgs e)
        {
            scanUDisk();
            
// listBox1.Items.Clear();
             foreach  ( string  s  in  diskList)
            {
                SetText(s);
            }
        }
///   <summary>
        
///  扫描U 口设备
        
///   </summary>
        
///   <param name="obj"></param>
         private   void  scanUDisk()
        {
            diskList.Clear();
            DriveInfo[] drives 
=  DriveInfo.GetDrives();

            
foreach  (DriveInfo drive  in  drives)
            {
                
if  ((drive.DriveType  ==  DriveType.Removable)  &&   ! drive.Name.Substring( 0 1 ).Equals( " A " ))
                {
                    
try
                    {
                        diskList.Add(drive.Name);
                    }
                    
catch
                    {
                        MessageBox.Show(
" 当前盘不能正确识别,请重新尝试! " " 提示 " , MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }
            }
        }
    } 
///   <summary>
    
///  windows 消息的常量
    
///   </summary>
     class  WndProMsgConst
    {
        
#region  WndProc 常量
        
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_DEVICETYPESPECIFIC  =   0x8005 ;
        
public   const   int  DBT_DEVNODES_CHANGED  =   0x0007 ;
        
public   const   int  DBT_QUERYCHANGECONFIG  =   0x0017 ;
        
public   const   int  DBT_USERDEFINED  =   0xFFFF ;
        
#endregion
    }
}



使用方 法如下:

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Text;
using  System.IO;
using  System.Windows.Forms;
using  System.Threading;

namespace  WindowsApp
{
    
public   partial   class  ComboBoxForm2 : Form
    {
        
public  ComboBoxForm2()
        {
            InitializeComponent();
        }

        
protected   override   void  WndProc( ref  Message m)
        {
            Class1 c
= new  Class1();
            c.filldata(
this ,m, listBox1);
            
            
base .WndProc( ref  m);
        }
       
    }
   
}
分享到:
评论

相关推荐

    Qt C++ 动态检测优盘插入或拔出

    `DBT_DEVICEREMOVECOMPLETE`表示设备被移除,`DBT_DEVICEARRIVAL`则表示新设备插入。针对这两种情况,你可以执行相应的操作,比如刷新文件浏览器的目录列表。 由于Qt本身并不直接提供设备变更的API,因此我们需要...

    自动识别插入电脑设备的代码c#USB串口

    case WM_DEVICECHANGE_WPPARAMS.DBT_DEVICEARRIVAL: // 设备插入时的操作 break; case WM_DEVICECHANGE_WPPARAMS.DBT_DEVICEREMOVECOMPLETE: // 设备移除完成时的操作 break; // 其他事件的处理逻辑 default...

    USB-JianCe.rar_U盘插拔_basic usb_usb_usb 检测_visual basic usb

    在这个示例中,`WndProc`方法重写了窗体的消息处理,当接收到WM_DEVICECHANGE消息时,会检查设备事件类型(插入或拔出),然后通过系统API获取设备的相关信息,比如卷名。`IsUSBDrive`函数用于根据卷名判断是否为U盘...

    检测U盘插入

    - 当检测到`DBT_DEVICEARRIVAL`事件时,表示一个新的可移动设备(如U盘)被插入了。 - 此时,可以通过`DriveInfo.GetDrives()`获取所有驱动器的信息,并遍历它们来查找新插入的U盘。 - 一旦找到U盘,可以根据需求...

    利用Windows注册DeviceChange消息检测硬件变动

    而`DBT_DEVICEARRIVAL`表示有新设备插入。根据这些信息,你可以执行相应的操作,如重新扫描设备、更新用户界面等。 在实际应用中,`DeviceChange`消息的处理可能涉及到多线程编程,因为设备事件可能会在用户界面...

    vc编程检测u盘插入

    - 当接收到`WM_DEVICECHANGE`消息且`wParam`等于`DBT_DEVICEARRIVAL`时,表示有新设备插入。 - `lParam`指向了`DEV_BROADCAST_VOLUME`结构体,其中`dbcv_unitmask`成员包含了发生改变的卷信息。 - 通过`...

    一个监听USB的程序代码(C)

    代码中定义了一系列的常量,包括 WM_DEVICECHANGE、DBT_DEVICEARRIVAL、DBT_CONFIGCHANGECANCELED、DBT_CONFIGCHANGED 等。这些常量用于标识不同的设备事件,例如设备插入、设备拔除、设备配置变化等。 Form1类 ...

    插入拔出U盘,获得U盘信息,ID号,产商号

    case DBT_DEVICEARRIVAL: // U盘插入处理 break; } } base.WndProc(ref m); } } ``` 以上代码片段展示了如何在C#中监听设备事件,当U盘插入或移除时,你可以调用相应的处理函数来获取设备信息。 总结来说,...

    USB监控,自动监控u盘插拔源代码

    `DBT_DEVICEREMOVECOMPLETE`表示设备已拔出,`DBT_DEVICEREMOVEPENDING`表示设备正在被拔出,而`DBT_DEVICEARRIVAL`表示有新设备插入。 接下来,我们需要注册窗口类以接收系统消息。这通常通过调用`RegisterClassEx...

    wince usb设备插入拔出检测代码

    2. 在`WM_DEVICECHANGE`消息处理器中,根据`wParam`区分设备插入和拔出事件。 3. 使用`SetupDiGetClassDevs`和`SetupDiEnumDeviceInfo`枚举设备,获取设备的友好名称,从而识别设备类型。 通过这样的方法,你可以...

    C# 检测U盘

    在这里,`WM_DEVICECHANGE`是设备事件消息,`DBT_DEVICEREMOVECOMPLETE`表示设备拔出,`DBT_DEVICEARRIVAL`表示设备插入。 为了启动设备通知,我们需要创建一个窗口实例并注册设备通知: ```csharp // 创建隐藏...

    VB 实现U盘插拔提醒

    消息`WM_DEVICECHANGE`标识了设备的变更,我们可以在`WndProc`中检查这个消息,然后根据消息的参数判断是否为U盘插入或移除。 3. **设备识别**: 在处理`WM_DEVICECHANGE`消息时,我们需要进一步解析设备信息。这...

    c++builder 中判断优盘检测

    case DBT_DEVICEARRIVAL: // 设备插入 // 在这里处理设备插入或移除的逻辑 break; } } return CallWindowProc((WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC), hWnd, message, wParam, lParam); } ``` 2. **...

    vc++监听U盘的插拔事件以及获取盘符

    当收到`DBT_DEVICEARRIVAL`(设备插入)或`DBT_DEVICEREMOVECOMPLETE`(设备移除)消息时,我们检查设备信息,确保它是一个USB设备。这通常通过比较设备描述符中的设备类型完成。 在处理`WM_DEVICECHANGE`消息时,...

    u盘操作程序详细代码介绍

    case DBT_DEVICEARRIVAL: // 设备插入 DriveInfo[] drives = DriveInfo.GetDrives(); foreach (DriveInfo drive in drives) { if (drive.DriveType == DriveType.Removable) { listBox1.Items.Add("U盘名称为...

    VB使用U盘检测

    Case DBT_DEVICEARRIVAL ' 设备插入 ' 同样检查设备是否为U盘,然后执行相应操作 End Select End If MyBase.WndProc(m) End Sub Private Sub Form1_FormClosing(sender As Object, e As ...

    VB自动检测U盘的插拔并弹出 提示

    然后,我们创建一个事件处理函数,当收到`WM_DEVICECHANGE`消息时,检查是否为U盘插入或移除事件,并显示相应的消息框: ```vb Private Sub Form_Load() Dim devNotify As DEVICE_NOTIFY_WINDOW_HANDLE Dim ...

    USB的监控1

    WM_DEVICECHANGE是一个Windows系统发出的消息,当系统的物理设备发生变化时(例如设备插入或拔出),系统会发送这个消息给注册了该消息的窗口。此消息包含有关硬件变化的详细信息。 ##### 2.3 DEV_BROADCAST_VOLUME...

    监控U盘插拔vc代码-好

    接着,代码定义了一系列与设备变化相关的常量,如`DBT_DEVICEARRIVAL`表示设备到达(U盘插入),`DBT_DEVICEREMOVECOMPLETE`表示设备移除完成(U盘被安全弹出)。这些常量是Windows的设备广播消息类型,它们允许程序...

    U盘检测工具 Delphi代码

    当`Message.wParam`为`DBT_DEVICEARRIVAL`时,表示有设备插入;如果是`DBT_DEVICEREMOVECOMPLETE`,则表示设备被拔出。针对这些事件,我们可以调用`GetVolumeInformation`函数来获取新插入U盘的盘符和其他相关信息:...

Global site tag (gtag.js) - Google Analytics