VB获取U盘 盘符

huangyahai 2008-11-16 02:40:54
各位大虾
我写了个U盘监控,当一插入U盘马上获取这个消息。消息是可以截取到了
现在想获取插入的U盘盘符,该如何做。(不要去轮询DRIVELIST判断是否是可移除的)
...全文
860 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
terrywolf 2008-11-19
  • 打赏
  • 举报
回复
再顶一下!
terrywolf 2008-11-18
  • 打赏
  • 举报
回复
我也有这样的问题,谢谢楼主和楼上的了!
无·法 2008-11-18
  • 打赏
  • 举报
回复
Form1.frm
Option Explicit

Private Sub Form_Load()
HookForm Me '子类化窗体的消息处理函数
End Sub

Private Sub Form_Unload(Cancel As Integer) '程序退出时恢复原窗体处理函数
UnHookForm Me
End Sub



Module1.bas
Option Explicit

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Const GWL_WNDPROC = -4
Const WM_DEVICECHANGE As Long = &H219
Const DBT_DEVICEARRIVAL As Long = &H8000&
Const DBT_DEVICEREMOVECOMPLETE As Long = &H8004&
'设备类型:逻辑卷标
Const DBT_DEVTYP_VOLUME As Long = &H2
'与WM_DEVICECHANGE消息相关联的结构体头部信息
Private Type DEV_BROADCAST_HDR
lSize As Long
lDevicetype As Long '设备类型
lReserved As Long
End Type

'设备为逻辑卷时对应的结构体信息

Private Type DEV_BROADCAST_VOLUME
lSize As Long
lDevicetype As Long
lReserved As Long
lUnitMask As Long '和逻辑卷标对应的掩码
iFlag As Integer
End Type
Public info As DEV_BROADCAST_HDR
Public info_volume As DEV_BROADCAST_VOLUME
Public PrevProc As Long

Public Sub HookForm(F As Form)
PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub UnHookForm(F As Form)
SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc
End Sub

Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next
Select Case uMsg
Case WM_DEVICECHANGE 'USB DISK状态改变时(插入或拔出)会接收到此消息
Select Case wParam
Case DBT_DEVICEARRIVAL
Form1.Print Now; "有磁盘加入!";
'若插入USBDISK或者映射网络盘等则
'info.lDevicetype =2
'即DBT_DEVTYP_VOLUME
CopyMemory info, ByVal lParam, Len(info) '利用参数lParam获取结构体头部信息
If info.lDevicetype = DBT_DEVTYP_VOLUME Then
CopyMemory info_volume, ByVal lParam, Len(info_volume)
'检测到有逻辑卷添加到系统中,则显示该设备根目录下全部文件名
Form1.Print "盘符为:"; Chr(GetDriveName(info_volume.lUnitMask))
End If
Case DBT_DEVICEREMOVECOMPLETE
Form1.Print Now; "有磁盘卸载!";
'若移走USBDISK或者映射网络盘等则
'info.lDevicetype =2
'即DBT_DEVTYP_VOLUME
'利用参数lParam获取结构体头部信息
CopyMemory info, ByVal lParam, Len(info)
If info.lDevicetype = DBT_DEVTYP_VOLUME Then
CopyMemory info_volume, ByVal lParam, Len(info_volume)
Form1.Print "盘符为:"; Chr(GetDriveName(info_volume.lUnitMask))
End If
End Select
End Select
WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam) ' 调用原来的窗体消息处理函数
End Function

'根据输入的32位LONG型数据(只有一位为1)返回对应的卷标的ASCII数值
'规则是1:A、2:B、4:C等等
Function GetDriveName(ByVal lUnitMask As Long) As Byte
Dim i As Long
i = 0
While lUnitMask Mod 2 <> 1
lUnitMask = lUnitMask \ 2
i = i + 1
Wend
GetDriveName = Asc("A") + i
End Function
huangyahai 2008-11-18
  • 打赏
  • 举报
回复
楼上的朋友 不能够解决哦
没有高手过来帮忙吗

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧