如何检测到U盘准备退出.DBT
发布网友
发布时间:2024-01-20 21:17
我来回答
共1个回答
热心网友
时间:2024-10-01 04:26
U盘:如何检测到U盘准备退出. DBT_DEVICEQUERYREMOVE从来不触发,RegisterDeviceNotification注册也不行
详细描述:有时候拷贝U盘里的文件,但是点退出U盘的时候,会提示通用卷 无法停止等.
想获取U盘要退出的消息,提前处理停止拷贝. 可是BAIDU了几天了,没有效果. 还是发贴子 寻高人吧
注: 在基础版发了一贴,无人解答,故转到API寻高人解惑
很简单,被和谐了。。。
需要驱动级别的?
阿根廷巫师)
你好厉害呀. 刚被和谐了, 又回来了. 呵呵
哎,看来这个问题 确实不好解决. 翻遍了CSDN,游穿了BAIDU, 也没有找到答案.
看看这个有没有帮助:
http://topic.csdn.net/u/20090122/16/55b0ec9b-b84b-484a-8cca-53d4b5f8a860.html
回复东方之珠兄:
你那帖子,还有很多类似的. 都是检测U盘已经拔除了. 那时候U盘都拨出来了,我所要求的是获取U盘要拔出来的消息 ,也就是类似DBT_DEVICEQUERYREMOVE.
所以不符合要求.
我看了CSDN里的帖子,也有几个和我一样功能要求的,都没有获取到正确的答案. 截止日期为2011-02-22 15:57:00
贴出一个可以调试的代码.
要方便大家帮你.
Private Sub Form_Load()
Call DoRegisterDeviceInterface(Me.hWnd, hDevNotify)
HookForm Me '子类化窗体的消息处理函数
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnHookForm Me '程序退出时恢复原窗体处理函数
End Sub
Option Explicit
Public Type GUID
Data1(1 To 4) As Byte
Data2(1 To 2) As Byte
Data3(1 To 2) As Byte
Data4(1 To 8) As Byte
End Type
Public Type DEV_BROADCAST_DEVICEINTERFACE
dbcc_size As Long
dbcc_devicetype As Long
dbcc_reserved As Long
dbcc_classguid As GUID
dbcc_name As Long
End Type
Public Type DEV_BROADCAST_DEVICEINTERFACE2
dbcc_size As Long
dbcc_devicetype As Long
dbcc_reserved As Long
dbcc_classguid As GUID
dbcc_name As String * 1024
End Type
Public Declare Function RegisterDeviceNotification Lib "user32.dll" _
Alias "RegisterDeviceNotificationA" ( _
ByVal hRecipient As Long, _
NotificationFilter As Any, _
ByVal Flags As Long) As Long
Public Declare Function UnregisterDeviceNotification Lib "user32.dll" _
(ByVal hRecipient As Long) As Long
Public Const DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = &H4
Public Const DEVICE_NOTIFY_WINDOW_HANDLE = 0
Public Declare Sub CopyMemory Lib "kernel32" Alias _
"RtlMoveMemory" (Destination As Any, Source As Any, _
ByVal Length As Long)
Public 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
Public Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_DEVICECHANGE = &H219
Public Const UNSAFE_REMOVE = &H1C
Public glngPrevWndProc As Long
Public Type DEV_BROADCAST_HDR
dbch_size As Long
dbch_devicetype As Long
dbch_reserved As Long
End Type
Public Const DBT_CONFIGCHANGECANCELED As Long = 25
Public Const DBT_CONFIGCHANGED As Long = 24
Public Const DBT_CUSTOMEVENT As Long = 32744
Public Const DBT_DEVICEARRIVAL As Long = 32768
Public Const DBT_DEVICEQUERYREMOVE As Long = 32769
Public Const DBT_DEVICEQUERYREMOVEFAILED As Long = 32770
Public Const DBT_DEVICEREMOVECOMPLETE As Long = 32772
Public Const DBT_DEVICEREMOVEPENDING As Long = 32771
Public Const DBT_DEVICETYPESPECIFIC As Long = 32773
Public Const DBT_DEVNODES_CHANGED As Long = 7