to 陈辉: 主要问题是怎么判断现在移动硬盘是否已经插上了,判断出来这样遍历出来的磁盘盘符才是正确的。把代码贴出来,马上加分!用 OnDeviceChange API:Option ExplicitPrivate Type DEV_BROADCAST_HDR dbch_size As Long dbch_devicetype As Long dbch_reserved As Long End TypePrivate Type DEV_BROADCAST_VOLUME DBCV_Size As Long DBCV_DeviceType As Long DBCV_Reserved As Long DBCV_UnitMask As Long DBCV_Flags As Integer End TypePublic Type AUTO_RUN Flags As String End TypePrivate 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 LongPrivate Declare Function SetWindowLong Lib "user32" _ Alias "SetWindowLongA" _ (ByVal hWnd As Long, ByVal nIndex As Long, _ ByVal wNewWord As Long) As LongPrivate Const GWL_WNDPROC As Long = (-4) Private Const DBT_DEVICEARRIVAL As Long = 32768 Private Const DBT_DEVICEREMOVECOMPLETE As Long = 32772 Private Const DBT_DEVTYP_VOLUME As Long = &H2 Public Const WM_CLOSE As Long = &H10 Private Const WM_DEVICECHANGE As Long = &H219Public DeviceCallBack As Long'在你的主窗体调用这个函数 Public Sub StartUSBWatch(ByVal hWnd As Long) DeviceCallBack = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf OnDeviceChange) End Sub'退出程序时调用这个函数 Public Sub StopUSBWatch(ByVal hWnd As Long) DeviceCallBack = SetWindowLong(hWnd, GWL_WNDPROC, DeviceCallBack) End SubPublic Function OnDeviceChange(ByVal hWnd As Long, _ ByVal Msg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long
If Msg = WM_DEVICECHANGE Then '在这里添加你的代码 End If OnDeviceChange = CallWindowProc(DeviceCallBack, hWnd, Msg, wParam, lParam) End Function
在没插入前保存目前分区信息
当插入后再遍历一次即可
这种方法我也想到了,觉得挺麻烦,不知道有没有更好的方法,用api实现
呵呵移动硬盘的盘符是怎么排列的,没用过不过你可以去我的BLOG上看看判断U盘那个,,,是拦截的消息。估计移动硬盘插入也有对应消息发送到各个窗口吧。。
我的论坛还有更多的精彩文章和原创作品更多的VB源码等着你来下载
主要问题是怎么判断现在移动硬盘是否已经插上了,判断出来这样遍历出来的磁盘盘符才是正确的。把代码贴出来,马上加分!用 OnDeviceChange API:Option ExplicitPrivate Type DEV_BROADCAST_HDR
dbch_size As Long
dbch_devicetype As Long
dbch_reserved As Long
End TypePrivate Type DEV_BROADCAST_VOLUME
DBCV_Size As Long
DBCV_DeviceType As Long
DBCV_Reserved As Long
DBCV_UnitMask As Long
DBCV_Flags As Integer
End TypePublic Type AUTO_RUN
Flags As String
End TypePrivate 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 LongPrivate Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, _
ByVal wNewWord As Long) As LongPrivate Const GWL_WNDPROC As Long = (-4)
Private Const DBT_DEVICEARRIVAL As Long = 32768
Private Const DBT_DEVICEREMOVECOMPLETE As Long = 32772
Private Const DBT_DEVTYP_VOLUME As Long = &H2
Public Const WM_CLOSE As Long = &H10
Private Const WM_DEVICECHANGE As Long = &H219Public DeviceCallBack As Long'在你的主窗体调用这个函数
Public Sub StartUSBWatch(ByVal hWnd As Long)
DeviceCallBack = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf OnDeviceChange)
End Sub'退出程序时调用这个函数
Public Sub StopUSBWatch(ByVal hWnd As Long)
DeviceCallBack = SetWindowLong(hWnd, GWL_WNDPROC, DeviceCallBack)
End SubPublic Function OnDeviceChange(ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
If Msg = WM_DEVICECHANGE Then
'在这里添加你的代码
End If
OnDeviceChange = CallWindowProc(DeviceCallBack, hWnd, Msg, wParam, lParam)
End Function
使用WMI更简单而且比你的这个方法要好的多
>使用WMI更简单而且比你的这个方法要好的多看你的代码太难了,还要10点以上阅读权限。我哪里有?你为何不贴出来?
>楼上的去看看我的代码
>使用WMI更简单而且比你的这个方法要好的多看你的代码太难了,还要10点以上阅读权限。我哪里有?你为何不贴出来?
注册会员即可察看了
问一下,能不能不引用wmi判断
(打破沙锅问到底,呵呵)