- 浏览: 863905 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (280)
- java相关 (29)
- linux系统 (55)
- ipsec (0)
- ssl (3)
- 信息安全 (13)
- web相关 (35)
- windows (9)
- c,c++ (14)
- log4j (3)
- hibernate (8)
- sqlite (1)
- 程序人生 (2)
- js (2)
- 生活点滴 (3)
- 网络相关 (14)
- 问题积累 (15)
- 数据库相关 (27)
- 软件测试 (2)
- PKI相关 (2)
- 程序设计 (7)
- 犄角旮旯 (0)
- 杂七杂八 (0)
- 硬件相关 (14)
- 防火墙 (2)
- 电子商务 (2)
- 多媒体相关 (1)
- 内存管理 (4)
- 面向对象 (1)
- csp (1)
- 驱动开发 (3)
- 移动开发 (2)
- openssl多线程实例 (1)
最新评论
-
xiaoyao3857:
博主很有探索精神嘛,学习了
Linux主机名Hostname详解 -
hiskyrisa:
言简意赅,好文章。
Flex是什么 -
layznet:
犯了类似错误。使用的是derby数据库。driverClass ...
java.sql.SQLException: No suitable driver -
idision:
你好,文章有一句createSubjectKeyId(keyT ...
bouncycastle 产生证书 -
zheng12tian:
代码有全的不?只贴一部分,,,,
在LOG4J中把日志写入远程数据库
U 盘加载,卸载,拔出,插入,WM_DEVICECHANGE,WndProc,DBT_DEVICEARRIVAL,DBT_DEVICEREMOVECOMPLE
- 博客分类:
- c,c++
最近在做一个和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
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
}
}
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);
}
}
}
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);
}
}
}
发表评论
-
关于从WEB服务器自动下载安装可执行性文件的方法
2010-09-20 15:17 3923首先,想要在客户端直接执行服务器端的程序,必须做一个Activ ... -
VC中简单操作注册表
2010-09-19 14:30 2608本文只是对注册表实现简单的打开、创建、读、写、关闭操作,故只是 ... -
Activex控件在IE中也可以不显示安全提示
2010-09-17 17:08 2808转csdn网友shepherds() 在class ... -
DeviceIoControl的使用说明
2010-05-25 17:39 1760应用程序和驱动程序的通信过程是:应用程序使用Cr ... -
Enable3dControls()和Enable3dControlsStatic()函数简介
2010-05-25 09:44 3317Enable3dControls()和Enable3dCont ... -
CString,string,char* 之间的转换
2010-05-24 11:49 1344这几天经常用到的,不如记下吧。 这三种类型各有各的优点, ... -
_cdecl 和_stdcall
2009-08-04 17:12 1396_cdecl 是C Declaration的缩 ... -
指针和数组之区别
2009-07-25 20:00 3175数组名可以当作一个指针来用,数组名可以用*取其中的值,指针也可 ... -
c++内存管理
2009-06-29 10:12 11031. void GetMemory(char *p) { ... -
C++ Primer中文版(第4版) 随书源码
2009-06-07 22:08 2161MS_files.zip for windows using ... -
#include "" 和#include <> 区别问题
2009-06-07 21:02 1094clude ""是先从本地目录开始寻找 ... -
std::cout 与\n
2009-06-07 19:53 1893#includ<iostream> int mai ... -
逗号运算符
2009-05-18 11:40 1349C 语言中,逗号(,)也可以是运算符,称为逗号运算符(Comm ...
相关推荐
`DBT_DEVICEREMOVECOMPLETE`表示设备被移除,`DBT_DEVICEARRIVAL`则表示新设备插入。针对这两种情况,你可以执行相应的操作,比如刷新文件浏览器的目录列表。 由于Qt本身并不直接提供设备变更的API,因此我们需要...
case WM_DEVICECHANGE_WPPARAMS.DBT_DEVICEARRIVAL: // 设备插入时的操作 break; case WM_DEVICECHANGE_WPPARAMS.DBT_DEVICEREMOVECOMPLETE: // 设备移除完成时的操作 break; // 其他事件的处理逻辑 default...
在这个示例中,`WndProc`方法重写了窗体的消息处理,当接收到WM_DEVICECHANGE消息时,会检查设备事件类型(插入或拔出),然后通过系统API获取设备的相关信息,比如卷名。`IsUSBDrive`函数用于根据卷名判断是否为U盘...
- 当检测到`DBT_DEVICEARRIVAL`事件时,表示一个新的可移动设备(如U盘)被插入了。 - 此时,可以通过`DriveInfo.GetDrives()`获取所有驱动器的信息,并遍历它们来查找新插入的U盘。 - 一旦找到U盘,可以根据需求...
而`DBT_DEVICEARRIVAL`表示有新设备插入。根据这些信息,你可以执行相应的操作,如重新扫描设备、更新用户界面等。 在实际应用中,`DeviceChange`消息的处理可能涉及到多线程编程,因为设备事件可能会在用户界面...
- 当接收到`WM_DEVICECHANGE`消息且`wParam`等于`DBT_DEVICEARRIVAL`时,表示有新设备插入。 - `lParam`指向了`DEV_BROADCAST_VOLUME`结构体,其中`dbcv_unitmask`成员包含了发生改变的卷信息。 - 通过`...
代码中定义了一系列的常量,包括 WM_DEVICECHANGE、DBT_DEVICEARRIVAL、DBT_CONFIGCHANGECANCELED、DBT_CONFIGCHANGED 等。这些常量用于标识不同的设备事件,例如设备插入、设备拔除、设备配置变化等。 Form1类 ...
case DBT_DEVICEARRIVAL: // U盘插入处理 break; } } base.WndProc(ref m); } } ``` 以上代码片段展示了如何在C#中监听设备事件,当U盘插入或移除时,你可以调用相应的处理函数来获取设备信息。 总结来说,...
`DBT_DEVICEREMOVECOMPLETE`表示设备已拔出,`DBT_DEVICEREMOVEPENDING`表示设备正在被拔出,而`DBT_DEVICEARRIVAL`表示有新设备插入。 接下来,我们需要注册窗口类以接收系统消息。这通常通过调用`RegisterClassEx...
2. 在`WM_DEVICECHANGE`消息处理器中,根据`wParam`区分设备插入和拔出事件。 3. 使用`SetupDiGetClassDevs`和`SetupDiEnumDeviceInfo`枚举设备,获取设备的友好名称,从而识别设备类型。 通过这样的方法,你可以...
在这里,`WM_DEVICECHANGE`是设备事件消息,`DBT_DEVICEREMOVECOMPLETE`表示设备拔出,`DBT_DEVICEARRIVAL`表示设备插入。 为了启动设备通知,我们需要创建一个窗口实例并注册设备通知: ```csharp // 创建隐藏...
消息`WM_DEVICECHANGE`标识了设备的变更,我们可以在`WndProc`中检查这个消息,然后根据消息的参数判断是否为U盘插入或移除。 3. **设备识别**: 在处理`WM_DEVICECHANGE`消息时,我们需要进一步解析设备信息。这...
case DBT_DEVICEARRIVAL: // 设备插入 // 在这里处理设备插入或移除的逻辑 break; } } return CallWindowProc((WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC), hWnd, message, wParam, lParam); } ``` 2. **...
当收到`DBT_DEVICEARRIVAL`(设备插入)或`DBT_DEVICEREMOVECOMPLETE`(设备移除)消息时,我们检查设备信息,确保它是一个USB设备。这通常通过比较设备描述符中的设备类型完成。 在处理`WM_DEVICECHANGE`消息时,...
case DBT_DEVICEARRIVAL: // 设备插入 DriveInfo[] drives = DriveInfo.GetDrives(); foreach (DriveInfo drive in drives) { if (drive.DriveType == DriveType.Removable) { listBox1.Items.Add("U盘名称为...
Case DBT_DEVICEARRIVAL ' 设备插入 ' 同样检查设备是否为U盘,然后执行相应操作 End Select End If MyBase.WndProc(m) End Sub Private Sub Form1_FormClosing(sender As Object, e As ...
然后,我们创建一个事件处理函数,当收到`WM_DEVICECHANGE`消息时,检查是否为U盘插入或移除事件,并显示相应的消息框: ```vb Private Sub Form_Load() Dim devNotify As DEVICE_NOTIFY_WINDOW_HANDLE Dim ...
WM_DEVICECHANGE是一个Windows系统发出的消息,当系统的物理设备发生变化时(例如设备插入或拔出),系统会发送这个消息给注册了该消息的窗口。此消息包含有关硬件变化的详细信息。 ##### 2.3 DEV_BROADCAST_VOLUME...
接着,代码定义了一系列与设备变化相关的常量,如`DBT_DEVICEARRIVAL`表示设备到达(U盘插入),`DBT_DEVICEREMOVECOMPLETE`表示设备移除完成(U盘被安全弹出)。这些常量是Windows的设备广播消息类型,它们允许程序...
当`Message.wParam`为`DBT_DEVICEARRIVAL`时,表示有设备插入;如果是`DBT_DEVICEREMOVECOMPLETE`,则表示设备被拔出。针对这些事件,我们可以调用`GetVolumeInformation`函数来获取新插入U盘的盘符和其他相关信息:...