Форум я просмотрел на предмет наличия обсуждения тем и, даже, знаете чё нашел? Кошмар - "...как программно отключить светодиод флоппика?..." я б даже не придумал (а может можно программно поднять шторку этого флопика? )
Ладно, не суть. Я все к тому, что немного в тупик зашел.
Есть такая API [CallWindowProc] и, как я понял она выдает определенные сообщения при определенных, опять-таки, событиях системы. Еще нашел константу [WM_DEVICECHANGE = &H219], только в API Viwer'е ее, почему-то, нет. Пиплы этой апи, вернее сообщением WM_DEVICECHANGE определяют реакции устройств в системе (я, конкретно, нашел пример определения диска в CD-Rom'е).
Теперь я не могу разораться в этом примере и понять - можно его как-то "модернизировать" и следить за обращением к дисководу, вместо CD.
Вот найденный пример:
- Код: Выделить всё
'Проверка действия примера очень проста: запустите ваш VB Project на
'выполнение, затем отктройте дверцу СД-РОМа, вставьте диск, закройте СД-
'РОМ и смотрите на сообщение на вашей форме.
'КОД МОДУЛЯ
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 glngPrevWndProc As Long
Public Function MyWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_DEVICECHANGE Then
Select Case wParam
' Событие возникает при появлении нового диска в CD-ROM'е.
Case &H8000&
Call Form1.DeviceArrival
' Событие возникает при изъятии диска из CD-ROM'а
Case &H8004&
Call Form1.DeviceRemoveComplete
End Select
MyWindowProc = 0
Exit Function
End If
' остальные сообщения передаются для обработки стандартной процедуре окна
MyWindowProc = CallWindowProc(glngPrevWndProc, hwnd, Msg, wParam, lParam)
End Function
'КОД ФОРМЫ
'Как определить когда появляется и изымается компакт-диск из устройства CD-ROM?
Private Sub Form_Load()
' Перенаправление сообщений Windows от формы к собственной
' процедуре обработки сообщений Module1.MyWindowProc
glngPrevWndProc = GetWindowLong(hwnd, GWL_WNDPROC)
SetWindowLong hwnd, GWL_WNDPROC, AddressOf MyWindowProc
End Sub
Private Sub Form_Unload(Cancel As Integer)
' Возвращение управления форме
SetWindowLong hwnd, GWL_WNDPROC, glngPrevWndProc
End Sub
Sub DeviceArrival()
' Здесь вы можете поместить код, который будет выполнятся при
' появление компакт-диска в устройстве CD-ROM
Label1.Caption = "Появилось устройство"
End Sub
Sub DeviceRemoveComplete()
' Здесь вы можете поместить код, который будет выполнятся при
' удалении компакт-диска из устройства CD-ROM
Label2.Caption = "Устройство исчезло"
End Sub
Помогите разобраться. Я вообще тем путем иду? Или есть иные способы? Потому что я за 2 минуты чуть не повешался, когда сделал программу, обращающуюся к дисководу через интервал времени. Капец! Этот скрежет! Кажется даже тараканы выбегать начали...