Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: литера диска Добавлено: 19.08.05 15:18  

Автор вопроса:  Виталий | Web-сайт: www.feshin.info
Как можно получить литеру 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-сайт: sharpc.livejournal.com
 Профиль | | #2
Добавлено: 19.08.05 18:45
Хнык-хнык, не получается. Подключение сетевого диска ловит, а вот при вставке CD вообще не посылает сообщение WM_DEVICECHANGE.
Private Const GWL_WNDPROC = -4

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 ";DefWindowProcA" (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{
'    ;DWORD dbch_size;
'    ;DWORD dbch_devicetype;
'    ;DWORD 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{
'    ;DWORD dbcv_size;
'    ;DWORD dbcv_devicetype;
'    ;DWORD dbcv_reserved;
'    ;DWORD 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 & ";DBT_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 & ";DBT_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 "&#193;&#251;&#235; &#239;&#238;&#228;&#234;&#235;&#254;&#247;&#229;&#237; &#228;&#232;&#241;&#234; " & 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-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 20.08.05 15:12
Думаю, да, у меня выключен

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам