Требуется событие, что вставили CD в CD-Rom

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Требуется событие, что вставили CD в CD-Rom

Сообщение kibernetics » 14.09.2007 (Пт) 16:46

Оч. нужна реализация хука или ещё какой-то функции, которая может контролировать появление/извлечение диска из сидирома.
Может кто-то сталкивался? У меня есть какой-то пример, но он вроде как неработает. Может потому что у меня приводов в системе много.
Если кто может - хелп плис.

На всякий пожарный, прикладываю примерчик хука, который должен работать, но у меня чего-то неработает.
Вложения
CD-DRIVE Hook.rar
Образец хука
(6.28 Кб) Скачиваний: 65

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 14.09.2007 (Пт) 19:06

Как-то так:
Project->References->Microsoft WMI Scripting V 1.2. Library

Код: Выделить всё
Private objSWbemServices As SWbemServices
Private WithEvents objSink As SWbemSink

Private Sub Form_Load()
Dim strComputer As String
    strComputer = "."
    Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
    Set objSink = New SWbemSink
    objSWbemServices.ExecNotificationQueryAsync objSink, "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_CDROMDrive'"
End Sub

Private Sub Form_Unload(Cancel As Integer)
    objSink.Cancel
    Set objSink = Nothing
End Sub

Private Sub objSink_OnObjectReady(ByVal objWbemObject As WbemScripting.ISWbemObject, ByVal objWbemAsyncContext As WbemScripting.ISWbemNamedValueSet)
     If IsNull(objWbemObject.TargetInstance.VolumeSerialNumber) Then
        Me.Caption = "Диска нет"
     Else
        Me.Caption = "Диск номер: " & objWbemObject.TargetInstance.VolumeSerialNumber
     End If
End Sub


Пример, конечно сыроват, но он дан с целью направить на путь использования WMI... :)
Salus populi suprema lex

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 17.09.2007 (Пн) 9:42

а если не трогать WMI, а обратить внимание на то, что один чел сказал, мол:
WindowProc never gets the WM_DEVICECHANGE message

это как-то поможет разобраться с приведённым выше примером?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 17.09.2007 (Пн) 10:19

dr.MIG

Ты на загрузку проца смотрел?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 17.09.2007 (Пн) 10:24

Вот так работает.

Код: Выделить всё
Public Function WindowProc(ByVal hwnd As Long, ByVal WindowMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next
If WindowMsg = WM_DEVICECHANGE Then
    Dim DBHdr   As DEV_BROADCAST_HDR
    Dim DBVol   As DEV_BROADCAST_VOLUME
    CopyMemory DBHdr, ByVal lParam, LenB(DBHdr)
    If WindowMsg = WM_DEVICECHANGE Then
     Select Case wParam
        Case DBT_DEVICEARRIVAL
            If DBHdr.dbch_devicetype = DBT_DEVTYP_VOLUME Then
                CopyMemory DBVol, ByVal lParam, LenB(DBVol)
                If (DBVol.dbcv_flags And DBTF_MEDIA) = DBTF_MEDIA Then
                    user_control.cdevent False, Chr$(FirstDriveFromMask(DBVol.dbcv_unitmask))
                End If
            End If

        Case DBT_DEVICEREMOVECOMPLETE
            If DBHdr.dbch_devicetype = DBT_DEVTYP_VOLUME Then
                CopyMemory DBVol, ByVal lParam, LenB(DBVol)
                If (DBVol.dbcv_flags And DBTF_MEDIA) = DBTF_MEDIA Then
                    user_control.cdevent True, Chr$(FirstDriveFromMask(DBVol.dbcv_unitmask))
                End If
            End If
    End Select
    End If
End If
End Function

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 18.09.2007 (Вт) 18:03

jangle
увы, но неработает :(

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 18.09.2007 (Вт) 19:12

kibernetics писал(а):jangle
увы, но неработает :(


Все работает! Проверил на двух машинах. Ты вышеприведенный код добавил в проект?

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 18.09.2007 (Вт) 21:07

А у меня все и так работает. Операционка Win Xреново Работает SP2
Подпись проходит рефакторинг

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 19.09.2007 (Ср) 12:11

Незнаю что за баг...
вот скомпильнутый проект.
Посмотрите у кого-нить работает или нет.
Вложения
CDHookCompiled.rar
(9.16 Кб) Скачиваний: 56

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 19.09.2007 (Ср) 12:23

Вот исправленный и скомпиленный проект.
И еще ты как пытаешься его запустит? Просто открываешь/закрываешь лоток привода, или открываешь/закрываешь с вставленным диском? Как говорят в Одессе, это две большие разницы...
Вложения
CD-DRIVE Hook.rar
(20.07 Кб) Скачиваний: 66

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 19.09.2007 (Ср) 12:28

со вставленным диском,
даже, если точнее с диском на котором закрыта сессия

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 20.09.2007 (Чт) 11:16

Короче чел один написал, что:
This is because if you think about it, some drives do not have trays. Devices can have conventional trays, caddys, slots, manual trays (laptops), and even changers. Keeping this in mind, you cannot generically have a open/closed tray state for everything. Truthfully, you don't really need to know... You only need to know if a disc is loaded or not, and then the state of the disc as I mentioned above in 1-5 in my previous section above.

There is no reliable event generated by the OS to get this information. In theory there is, but settings on different OS platforms can change the behavior thus making the events (Win32 DeviceChange message) very unreliable.

Посему наверное рассчитывать на DeviceChange нет смысла большого. Но как это делает Неро интересно... по таймеру чтоли

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.09.2007 (Чт) 11:35

Nero периодически опрашивает.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 100

    TopList