|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.04.2016, 16:45 | #1 |
Пользователь
Регистрация: 08.05.2014
Сообщений: 17
|
C++/CLI Windows Forms Обработка сообщения WM_DEVICECHANGE
Доброго всем времени суток, коллеги!
Пишу проект на C++/CLI Windows Forms в Visual Studio 2010(2013). В программе мне нужно отлавливать сообщение WM_DEVICECHANGE (всякий раз, когда во время работы программы происходит извлечение, или вставка какого-либо USB устройства) и обрабатывать его (обновлять дерево устройств, ну как в Диспетчере устройств в общем). Для этого написал вот такой класс: Код:
Подскажите, пожалуйста, кто знает в чем может быть дело, или кто имел опыт с такой задачей для C++/CLI Windows Forms. Заранее спасибо! P.S. Если понадобятся исходники всего проекта, приложу его тоже. |
06.04.2016, 16:54 | #2 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Так NotificationHandle вроде ж тут не инициализировано никак?
Это хендл окна, которому будут сообщения отправляться. Наверно вам надо передать сюда хендл своей формы.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
06.04.2016, 16:55 | #3 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
Если указали DEVICE_NOTIFY_ALL_INTERFACE_CLASSES , то dbcc_classguid будет игнорироваться и заполнять его не обязательно. А вот DEVICE_NOTIFY_WINDOW_HANDLE или DEVICE_NOTIFY_SERVICE_HANDLE все-таки стоит. Ну и, естественно, хендл должен быть хендлом, а не просто полем.
|
06.04.2016, 22:23 | #4 |
Пользователь
Регистрация: 08.05.2014
Сообщений: 17
|
Ну по идее да. А не подскажете этот самый хэндл формы тут передаётся? А то я с этим хэндлами уже запутался откуда какой и как получить...
|
06.04.2016, 22:26 | #5 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
myForm.Handle https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
06.04.2016, 22:36 | #6 | |
Пользователь
Регистрация: 08.05.2014
Сообщений: 17
|
Цитата:
Но это сейчас не суть. Похоже, что действительно проблема с хэндлом формы. Даже в дебаге, когда по шагам смотрел значения полей, на хэндле пишет <неопределенное значение>. Вот только как взять хэндл формы чет запутался. |
|
06.04.2016, 23:28 | #7 | |
Пользователь
Регистрация: 08.05.2014
Сообщений: 17
|
Цитата:
Код:
Но сообщения все равно не отлавливаются(( Запускаю программу, вытаскиваю и вставляю любое USB устройство и NULL реакции Что еще может быть не так? На всякий случай прикреплю проект. Может так удобнее будет посмотреть... https://yadi.sk/d/t5qiQWdhqo5cM Последний раз редактировалось Alex11223; 07.04.2016 в 15:50. |
|
07.04.2016, 15:59 | #8 | |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Цитата:
Вам нужен Handle экземпляра формы используемого в вашем приложении. Я кстати не в курсе что за IMessageFilter/AddMessageFilter и как оно работает, вроде обычно WndProc вместо этого используют в WinForms. Вот пример на C# http://stackoverflow.com/a/16245901/964478 Код:
Код:
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. Последний раз редактировалось Alex11223; 07.04.2016 в 16:08. |
|
07.04.2016, 19:16 | #9 | |
Пользователь
Регистрация: 08.05.2014
Сообщений: 17
|
Цитата:
IMessageFilter - это класс в котором реализуется обработка сообщений Message. Он и подставляется в мэйн функции в AddMessageFilter, в качестве параметра, и в идеале так же в фоне работы программы отслеживает и обрабатывает виндоус сообщения, по тем инструкциям, какими это заданно внутри IMessageFilter, а конкретнее в функции virtual bool PreFilterMessage(Message % m) Код:
Код:
С Вашей помощью решить проблему с регистрацией приложения, передав правильный хэндл, похоже удалось! За что отдельное спасибо! Однако это пока так и не решило проблему по перехвату сообщения WM_DEVICECHANGE. Если разкомментировать участок кода с проверкой сообщения WM_LBUTTONDOWN, то его фильтр AddMessageFilter обрабатывает прекрасно, а вот сообщение WM_DEVICECHANGE все еще почему-то не видит... Далее. Вы говорили про возможность воспользоваться функцией WndProc. По приведенному Вами примеру кода на С#, я переписал под С++ эту функцию так: Код:
Код:
Какие будут мысли, предложения, варианты? P.S. обновил проект, вот ссылка, если кому понадобится https://yadi.sk/d/mxBfzORIqpPQ2 Последний раз редактировалось Cha1000000; 07.04.2016 в 19:24. |
|
07.04.2016, 19:21 | #10 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Скорее всего в WndProc надо родительскую функцию WndProc вызвать в начале.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Блок редактирования первой формы через вторую- C++/CLI Windows Forms | kirill1507 | Windows Forms | 9 | 05.03.2016 14:31 |
DirectInput и джойстик (C++/CLI, Windows Forms) | Vistaern | Win Api | 1 | 21.02.2013 06:48 |
вывод сообщения в windows forms | василий- | Windows Forms | 0 | 23.10.2012 11:46 |
Проблема с выделением памяти в глобальной области windows forms(C++\CLI) | DartLenin | Помощь студентам | 2 | 24.01.2012 20:58 |
Проблема с отображением русского языка (Windows Forms C++ CLI) | Alex TGM | Помощь студентам | 0 | 17.08.2010 11:13 |