Страница: 1 |
Страница: 1 |
Вопрос: литера диска
Добавлено: 19.08.05 15:18
Автор вопроса: Виталий | Web-сайт:
Как можно получить литеру CD (DVD) диска, вставленного в один из n количества дисководов?
Например в один из десяти дисков (CD; DVD)
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #1
Добавлено: 19.08.05 15:56
Отловить WM_DEVICECHANGE.
Проверить, не является ли wParam DBT_DEVICEARRIVAL.
Если является, проверить, трактовать lParam как указатель на DEV_BROADCAST_HDR и проверить, чему равен её член dbch_devicetype.
Если он равен DBT_DEVTYP_VOLUME, то трактовать lParam как указатель на DEV_BROADCAST_VOLUME, взять его dbcv_flags и проверить, не содержится ли там DBTF_MEDIA. Если содержится, то взять оттуда же dbcv_unitmask и получить из неё букву диска (бит 0 - A, бит 1 - B, бит 2 - C...).
Номер ответа: 2
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #2
Добавлено: 19.08.05 18:45
Хнык-хнык, не получается. Подключение сетевого диска ловит, а вот при вставке CD вообще не посылает сообщение WM_DEVICECHANGE.
Private Const WM_DEVICECHANGE As Long = &H219&
Private Const DBT_DEVICEARRIVAL As Long = &H8000&
Private Const DBT_DEVTYP_VOLUME As Long = &H2&
Private Const DBTF_MEDIA As Long = &H1
Private Const DBTF_NET As Long = &H2
Private Declare Function DefWindowProc Lib "user32" Alias "efWindowProcA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private 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
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Sub CopyMemoryAL Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByVal Source As Long, ByVal Length As Long)
'typedef struct _DEV_BROADCAST_HDR{
'  WORD dbch_size;
'  WORD dbch_devicetype;
'  WORD dbch_reserved;
'};
Private Type DEV_BROADCAST_HDR
dbch_size As Long
dbch_devicetype As Long
dbch_reserved As Long
End Type
'typedef struct _DEV_BROADCAST_VOLUME{
'  WORD dbcv_size;
'  WORD dbcv_devicetype;
'  WORD dbcv_reserved;
'  WORD dbcv_unitmask;
' WORD dbcv_flags;
'};
Private 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 Type
Dim lpPrevWndProc As Long
Public Sub Hook(ByVal hWnd As Long)
lpPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub Unhook(hWnd As Long)
SetWindowLong hWnd, GWL_WNDPROC, lpPrevWndProc
End Sub
Private Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim dbh As DEV_BROADCAST_HDR
Dim dbv As DEV_BROADCAST_VOLUME
If uMsg = WM_DEVICECHANGE Then
Form1.Text1 = Form1.Text1 & "WM_DEVICECHANGE(wParam = " & CStr(wParam) & ", lParam = " & CStr(lParam) & "" & vbCrLf
If wParam = DBT_DEVICEARRIVAL Then
CopyMemoryAL dbh, lParam, LenB(dbh)
Form1.Text1 = Form1.Text1 & "BT_DEVICEARRIVAL(dbch_devicetype = " & CStr(dbh.dbch_devicetype) & "" & vbCrLf
If dbh.dbch_devicetype = DBT_DEVTYP_VOLUME Then
CopyMemoryAL dbv, lParam, LenB(dbv)
Form1.Text1 = Form1.Text1 & "BT_DEVTYP_VOLUME(dbcv_flags = " & CStr(dbv.dbcv_flags) & ", dbcv_unitmask = " & CStr(dbv.dbcv_unitmask) & "" & vbCrLf
If (dbv.dbcv_flags And DBTF_MEDIA) <> 0 Then
MsgBox "Áûë ïîäêëþ÷åí äèñê " & CStr(Num2Litera(dbv.dbcv_unitmask))
End If
End If
End If
Else
WindowProc = CallWindowProc(lpPrevWndProc, hWnd, uMsg, wParam, lParam)
End If
End Function
Private Function Num2Litera(n As Long) As String
For i = 0 To 25
If (n And 2 ^ i) <> 0 Then
Num2Litera = Num2Litera & Chr(Asc("A" + i)
End If
Next
End Function
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 19.08.05 18:46
Павел, знаки & надо менять самыми первыми )
Номер ответа: 4
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #4
Добавлено: 20.08.05 04:03
Гы, только что проверил специально. Создал пустой проект в VB6, запустил форму, слежу за ней spy++, вставляю диск, приходит WM_DEVICECHANGE.
Мож включенность авторана влияет?
Номер ответа: 5
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #5
Добавлено: 20.08.05 15:12
Думаю, да, у меня выключен