1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
|
|||||||||||
1 | |||||||||||
Перехват wm_devicechange09.07.2017, 07:44. Показов 2047. Ответов 18
Здравствуйте написал простенькую программку по отлову сообщений вставки usb носителей. Собственно данный код отлавливает события.Приходит и DBT_DEVTYP_DEVICEINTERFACE и DBT_DEVTYP_VOLUME Но мне нужно сделать так чтобы программа отлавливала события без окна(или хотя бы чтобы окно было скрыто). Но когда я делаю
0
|
09.07.2017, 07:44 | |
Ответы с готовыми решениями:
18
WM_DEVICECHANGE WinAPI C++ WM_DEVICECHANGE Грабли с WM_DEVICECHANGE Как обработать WM_DEVICECHANGE? |
Ушел с форума
|
|
09.07.2017, 21:08 | 2 |
Вместо SW_HIDE лучше использовать HWND_MESSAGE в CreateWindow.
0
|
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
|
|||||||||||
09.07.2017, 22:13 [ТС] | 3 | ||||||||||
вместо
0
|
Ушел с форума
|
|
10.07.2017, 09:29 | 4 |
А RegisterDeviceNotification у тебя вызывается?
Тут загвоздка в том, что без RegisterDeviceNotification сообщение WM_DEVICECHANGE приходит только в top-level окна. Если ты делаешь ShowWindow(SW_HIDE) или создаешь окно с HWND_MESSAGE, то окно таким не является и сообщение не приходит.
0
|
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
|
|
10.07.2017, 11:13 [ТС] | 5 |
RegistrDeviceNotification у меня в обработке WM_PAINT. Я так понял что событие wm_paint не приходит когда я создаю окно с hwnd_message поэтому registerdevicenotification не выполняется.
Добавлено через 33 минуты Я так понял если использовать hwnd_message то в каком событии лучше регистрировать registerdevicenotification? В wm_create? Добавлено через 19 минут В итоге c hwnd_message создал глобальную булевую переменную и при первом заходе в wm_create регистрирую registerdevicenotification с dbt decrypted interface. И оно приходит. Не приходит dbt_devtype_volume. Но как я правильно понимаю его теперь тоже нужно регистрировать в отдельной registrdevicenotification?
0
|
Ушел с форума
|
|
10.07.2017, 11:27 | 6 |
Так перенеси его куда-нибудь в обработчик WM_CREATE.
В WM_PAINT таким вещам не место (эти сообщения ведь приходят сотнями и тысячами). Да.
0
|
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
|
||||||
10.07.2017, 12:05 [ТС] | 7 | |||||
Да Я уже перенес все wm_create
Регистрирую dev broadcast volume после dev broadcast dev interface
Я подозреваю что нужно еще что-то задать?
0
|
Ушел с форума
|
|
10.07.2017, 12:09 | 8 |
Да. См. описание структуры DEV_BROADCAST_VOLUME в MSDN:
тогда уведомления будут приходить только при событиях на соответствующем диске. Так, например, можно отслеживать попытки извлечения USB-флэшки.
0
|
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
|
|
10.07.2017, 12:36 [ТС] | 9 |
Я так понимаю нужно задать как минимум еще dbcv_unitmask но я не знаю как...
Мне нужно чтобы приходило при втыкании любого USB носителя. Как задать значение не подскажете?
0
|
Ушел с форума
|
||||||
10.07.2017, 12:45 | 10 | |||||
Попробуй так:
0
|
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
|
|
10.07.2017, 14:29 [ТС] | 11 |
Те вы удтверждаете dev type volume нельзя поймать через окно hwnd_message?
Добавлено через 39 минут Задал маску сообщение все равно не приходит dbt_devtype_volume
0
|
Ушел с форума
|
|
10.07.2017, 14:37 | 12 |
Нет, я такого не говорил.
Просто подписываться на сообщения от тома, как мне кажется, можно только если сам том существует.
0
|
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
|
|
10.07.2017, 15:10 [ТС] | 13 |
Так как же получить DBT_DEVTYPE_VOLUME .......?
0
|
Ушел с форума
|
|
10.07.2017, 15:28 | 14 |
Ну ок, а что возвращает функция RegisterDeviceNotification? И что при этом в GetLastError()?
0
|
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
|
|
10.07.2017, 16:25 [ТС] | 15 |
Getlasterror возвращает 1066 по описанию это error_service_specific_error
Registerdevicenotification возвращает null
0
|
Ушел с форума
|
|
10.07.2017, 16:33 | 16 |
Значит, предположение подтвердилось и подписываться на сообщение WM_DEVICECHANGE + volume
можно только для существующих томов (как и для DBT_DEVTYPE_HANDLE, например). А отслеживать появление тома можно иначе. Например, RegisterDeviceNotification + DBT_DEVTYP_DEVICEINTERFACE и по приходу сообщения WM_DEVICECHANGE с кодом DBT_DEVICEARRIVAL искать новые буквы дисков в GetLogicalDriveStrings.
0
|
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
|
|
10.07.2017, 16:54 [ТС] | 17 |
Те вы предлагаете как я понял ПОСЛЕ запуска программы делать снимок дисков а потом в wm_devicechange проверять его?
0
|
Ушел с форума
|
|
10.07.2017, 16:58 | 18 |
Да, как вариант.
0
|
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
|
|
10.07.2017, 18:11 [ТС] | 19 |
Спасибо за помощь. Но возможно будут еще вопросы.
0
|
10.07.2017, 18:11 | |
10.07.2017, 18:11 | |
Помогаю со студенческими работами здесь
19
WM_DEVICECHANGE RegisterDeviceNotification PDEV_BROADCAST_HDR Не могу разобраться с WM_DEVICECHANGE RegisterDeviceNotification / WM_DEVICECHANGE / VID _ PID Обработка события подключения и отключения USB(WM_DEVICECHANGE) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |