|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
Грабли с WM_DEVICECHANGE03.10.2016, 22:16. Показов 15751. Ответов 63
Метки wm_devicechange (Все метки)
Потратил кучу времени на изучение структур связанных с WM_DEVICECHANGE. Все работает как надо wParam == DBT_DEVICEARRIVAL , отлавливает сообщение о новом диске, lParam передает информацию о букве и т д. Но WM_DEVICECHANGE ловит сообщения только о монтировании нового диска! Но если есть встроенный картридер и пользователь вставляет в него карточку, то сообщение не приходит, так как диск уже смонтирован, а наличие карты не проверяется! На форумах самый умный совет - повесить таймер на картридер. Получаем грабли, зачем все эти манипуляции, если можно таймер повесить изначально на GetVolumeInformation? Получается в результате функция не полноценна так как пользователь может обойти любые ограничения, просто вставив карту в картридер. Что делать то ??
0
|
|
| 03.10.2016, 22:16 | |
|
Ответы с готовыми решениями:
63
WM_DEVICECHANGE WinAPI C++ WM_DEVICECHANGE Перехват wm_devicechange |
|
21 / 21 / 9
Регистрация: 09.10.2016
Сообщений: 113
|
|
| 10.10.2016, 00:50 | |
|
zombivadim, у меня не на чем проверять.
может это поможет http://stackoverflow.com/quest... on-wm-devi кардридер же usb'шный
0
|
|
|
Ушел с форума
|
|||
| 10.10.2016, 08:37 | |||
![]() Во-вторых, какой смысл мне пробовать этот пример, если я разницу не почувствую (т.к. у меня вставка SD-карты определяется сразу)?
0
|
|||
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
||
| 10.10.2016, 22:26 [ТС] | ||
|
0
|
||
|
Ушел с форума
|
|||||||
| 11.10.2016, 09:25 | |||||||
Сообщение было отмечено zombivadim как решение
Решение
Вот код (вместе с WM_DEVICECHANGE), собирал в Visual C++ 2008:
Кликните здесь для просмотра всего текста
Лог-файл (последовательно вставлялись и извлекались SD-карта, CD-диск и USB-флэшка): Кликните здесь для просмотра всего текста
3
|
|||||||
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
| 11.10.2016, 19:32 [ТС] | |
|
Убежденный, Большое вам спасибо!
0
|
|
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
| 11.10.2016, 21:24 [ТС] | |
|
castaway, Могу сказать, что WM_DEVICECHANGE, не посылает сообщения если не монтируется диск, это 100 % тупиковый вариант. И как не извращаться с RegisterDeviceNotification, и с GUID, результата не будет. И проблема вовсе не в самой функции, а в устройстве, которое не посылает нужное сообщение.
0
|
|
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
| 11.10.2016, 21:57 [ТС] | |
|
0
|
|
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
| 11.10.2016, 22:58 [ТС] | |
|
castaway, Ну да процесс простой. Смотрите наличие у вас флешки в сотовом телефоне, фотоаппарате, видеорегистраторе, и за пару американских рублей покупаете под него картридер. Вставляете картридер в комп, потом вставляете в него флеш карту, и смотрите сообщения WM_DEVICECHANGE, потом долгое время ковыряете RegisterDeviceNotification, и если получаете сообщение, то вам большой респект)
Добавлено через 16 минут Можете почитать вот эти ссылки http://minilabmaster.com/smf2/... 887.0.html http://forum.sources.ru/index.php?showtopic=146127 и т.д Добавлено через 22 минуты Убежденный, Почитал ваш код в примере SHChangeNotifyRegister, это просто кладезь знаний ), одно вот это #define WM_CHANGE_NOTIFY (WM_APP + 1)!! Константа WM_APP используется, чтобы различать между значениями сообщений, которые зарезервированы для использования системой и значениями, которые могут быть использованы в приложении, чтобы отправить сообщения в пределах отдельного класса окна. Или SHGetFolderLocation CSIDL_DESKTOP Виртуальная папка, которая представляет на рабочем столе Windows, корень пространства имен. ( Даже не представляю как это работает). Такое ощущение что я понимаю принцип, но не понимаю как же это работает то.
0
|
|
|
Ушел с форума
|
||
| 11.10.2016, 23:11 | ||
|
1. RegisterDeviceNotification с DBT_DEVTYP_HANDLE. 2. FindFirstChangeNotification на смонтированном томе SD-карты. Ожидание не выносить в отдельный поток, а доверить функции RegisterWaitForSingleObject. Хотя это тоже слегка костыльно - ждать на хэндле тома, который, может, никогда не будет подключен (т.е. карту ведь не обязаны сразу вставлять). Я еще смотрел API для Windows Portable Devices, но там, похоже, нет способа подписаться на появление в системе новых WPD-устройств, только злобный polling (опрос в цикле с задержкой).
0
|
||
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
| 12.10.2016, 10:43 [ТС] | |
|
Убежденный, Подскажите, а как с помощью FindFirstChangeNotification , получит букву диска приславшего SHCNE_DRIVEADD,SHCNE_MEDIAINSERTED?
Добавлено через 25 минут Ой опечатался, с помощью SHChangeNotifyRegister получить букву диска приславшего SHCNE_DRIVEADD,SHCNE_MEDIAINSERTED
0
|
|
|
Ушел с форума
|
|
| 12.10.2016, 12:11 | |
|
В SHChangeNotification_Lock можно передать указатель на PITEMIDLIST.
Когда функция вернет управление, там будет id соответствующей папки. PITEMIDLIST - это что-то типа id файлового объекта. Преобразовать его в путь можно функцией SHGetPathFromIDList.
0
|
|
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
||
| 12.10.2016, 21:03 [ТС] | ||
|
Добавлено через 4 минуты Мне уже неудобно как то вас просить, о примере. Но если вам не трудно, просто в данный момент я бьюсь с проблемой WM_DEVICECHANGE.
0
|
||
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
||||||
| 14.10.2016, 20:56 [ТС] | ||||||
|
Убежденный, У вас уже в SHChangeNotification_Lock есть, NULL, // [out] LPITEMIDLIST ** и есть LPITEMIDLIST pidl; Но как я не пытаюсь ничего не получается.
Добавлено через 2 минуты и в msdn нет никаких примеров ... Добавлено через 55 минут Вот так попробовал
Добавлено через 20 часов 58 минут Убежденный, Я не знаю уже как вас попросить помочь. Пожалуйста помогите мне получить путь к диску, у меня никак не получается. Добавлено через 7 минут У меня уже голова кругом идет от этих PITEMIDLIST, LPITEMIDLIST, LPCITEMIDLIST.
0
|
||||||
|
Ушел с форума
|
|||||
| 14.10.2016, 21:15 | |||||
|
Надо попробовать еще FindFirstChangeNotification на букве диска, например. И я думаю, что копать в сторону WM_DEVICECHANGE вообще бессмысленно, так как это сообщение приходит при изменении конфигурации оборудования, а в твоем случае эти изменения случаются только в момент подключения кардридера. Надо копать в сторону получения уведомлений от самих дисков или файловых систем. Как раз то, что делает FindFirstChangeNotification и ReadDirectoryChanges. Других путей я не вижу (кроме, ну разве что, написания драйвера-минифильтра файловой системы, но это явный overkill в данном случае).
0
|
|||||
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
||||
| 14.10.2016, 21:44 [ТС] | ||||
|
Добавлено через 2 минуты Добавлено через 2 минуты Добавлено через 5 минут Убежденный, SHChangeNotifyRegister выдает SHCNE_DRIVEADD, когда устройства нормально монтируются ( в этом случае их можно отследить и в WM_DEVICECHANGE), но иначе приходит сообщение SHCNE_MEDIAINSERTED и это работает для картридеров которые WM_DEVICECHANGE не видит!
0
|
||||
|
Ушел с форума
|
|||||||||||
| 15.10.2016, 08:42 | |||||||||||
|
вызвать фукцию с двумя аргументами и проверить, что в буфере, который она заполняет. Т.е. сравнивать пути, которые возвращает SHGetPathFromIDList. Что конкретно не получается? Да, и я добавлю по поводу третьего параметра функции SHChangeNotification_Lock, что он записывает не адрес PIDL, а адрес массива PIDL:
(https://github.com/pauldotknop... ifyWatcher кстати, рекомендую изучить), там есть такой код:
1
|
|||||||||||
|
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
|
|
| 15.10.2016, 14:21 [ТС] | |
|
0
|
|
| 15.10.2016, 14:21 | |
|
WM_DEVICECHANGE RegisterDeviceNotification PDEV_BROADCAST_HDR Как обработать WM_DEVICECHANGE?
RegisterDeviceNotification / WM_DEVICECHANGE / VID _ PID Обработка события подключения и отключения USB(WM_DEVICECHANGE) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
|
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи.
. . .
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|