Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

WM_DEVICECHANGE Message in Windows 7

21K
23 февраля 2010 года
TITAMIN
58 / / 24.07.2008
В XP & 2000 отрабатывает на ура !!! PretranslateMessage() - отлавливаю сообщение (параметры не интересуют - необходимо просто знать о изменении списка устройств)...
Даже без регистрации на приход данного сообщения (RegisterDeviceNotification)!!!
Но в семерке тупо не приходит, на Vista не пробывал .
Все перепробывал для семерки - RegisterDeviceNotification в том числе ... Пока ритарический вопрос - в Семерке работать должно ???
Ну и в Vista соответственно ... Заранее спасибо .
21K
24 февраля 2010 года
TITAMIN
58 / / 24.07.2008
какие-нибудь идеи ?
19K
26 февраля 2010 года
Mhael
54 / / 20.03.2008
Телепаты в отпуске, поэтому попробую ответить я.
Посмотрите какой код ошибки вам возвращает система. Помедитируйте.
С какими правами вы это выполняете? Я только что выполнил под учеткой с правами администратора - все работает.
21K
01 марта 2010 года
TITAMIN
58 / / 24.07.2008
Высоко уважаемый Mhael & Kot_ !!!

По поводу прав: Если Вы о смене параметров управления учетными записями - то отключил, учетка админа, плюс тыкал стандартно - контекстное меню с правами админа ...
По поводу ошибки:
Было четко описано в моем вопросе, что я отлавливаю сообщение в PretranslateMessage() - не понимаю какая может быть ошибка ??? - Сообщения нет ... (если не прав - поправте!!! как можно получить код ошибки на не приход сообщения ???) подскажите как это сделать ...
По поводу медитации: совет конечно НУЖНЫЙ !!! Спасибо за столь нужный совет ))) непременно им воспользуюсь !!!
Заранее спасибо за ответ !!!
21K
02 марта 2010 года
TITAMIN
58 / / 24.07.2008
Высоко уважаемый Mhael & Kot_ !!!

По поводу прав: Если Вы о смене параметров управления учетными записями - то отключил, учетка админа, плюс тыкал стандартно - контекстное меню с правами админа ...
По поводу ошибки:
Было четко описано в моем вопросе, что я отлавливаю сообщение в PretranslateMessage() - не понимаю какая может быть ошибка ??? - Сообщения нет ... (если не прав - поправте!!! как можно получить код ошибки на не приход сообщения ???) подскажите как это сделать ...
По поводу медитации: совет конечно НУЖНЫЙ !!! Спасибо за столь нужный совет ))) непременно им воспользуюсь !!!
Заранее спасибо за ответ !!!
19K
02 марта 2010 года
Mhael
54 / / 20.03.2008
Неужели до сих пор не решили проблему? Я помнится то ли погуглил то ли полазил по мсдн и все быстро нашел.
const GUID MYGUID = {0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED}}; //какой-то нам нужный гуид

//регистрируемся на получение сообщений от USB
BOOL CMCardObserverDlg::RegDevInterface()
{
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
memset( &NotificationFilter, 0x00, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
//общий гуид для юсб девайсов, как я понял
NotificationFilter.dbcc_classguid = MYGUID;

hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
if(hDevNotify == NULL)
{ return FALSE; }

return TRUE;
}//RegrDevInterface()
//========================================================

Функция, которая ловит сообщения :
ON_MESSAGE(WM_DEVICECHANGE, OnMyDeviceChange) //так она в карте сообщений должна выглядеть
//ловля сообщений от юсб
LRESULT CMCardObserverDlg::OnMyDeviceChange(WPARAM wParam, LPARAM lParam)
{
if(wParam != DBT_DEVICEARRIVAL && wParam != DBT_DEVICEREMOVECOMPLETE) return 0;

PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;
PDEV_BROADCAST_DEVICEINTERFACE pDevInf;
//если не подходящее устройство
if(pHdr->dbch_devicetype != DBT_DEVTYP_DEVICEINTERFACE) return 0;

pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
wstring tstmpInf = pDevInf->dbcc_name; //получили имя
vector<wchar_t> vInfBuf(tstmpInf.size() + 1, 0);
memcpy(&vInfBuf[0], tstmpInf.c_str(), vInfBuf.size()); //имя в изменяемый буфер
_tcslwr_s(&vInfBuf[0], vInfBuf.size()); //в нижний регистр
//ищем наше ли устройство дернулось, по присутствию vidpid в имени
if( (wcsstr(&vInfBuf[0], MY_VID_PID) == NULL) == NULL) )
return 0; //это было не наше

if(wParam == DBT_DEVICEARRIVAL) //подключение
{ }
else //отключение
{ }
return 0;
}//OnDeviceChange
//========================================================

Вроде все скопипастил. Проект старый, много чего не помню, но вроде все должно работать и идеологически все верно.
Сам то пример из диалогового приложения мфц, но у вас отличие только в том, что юзаете PretranslateMessage , а я просто беру из карты сообщений, которая скрывает реализацию (там скорее всего тот же PretranslateMessage ).
1
02 марта 2010 года
kot_
7.3K / / 20.01.2000
Цитата: TITAMIN
Высоко уважаемый Mhael & Kot_ !!!

По поводу прав: Если Вы о смене параметров управления учетными записями - то отключил, учетка админа, плюс тыкал стандартно - контекстное меню с правами админа ...
По поводу ошибки:
Было четко описано в моем вопросе, что я отлавливаю сообщение в PretranslateMessage() - не понимаю какая может быть ошибка ??? - Сообщения нет ... (если не прав - поправте!!! как можно получить код ошибки на не приход сообщения ???) подскажите как это сделать ...
По поводу медитации: совет конечно НУЖНЫЙ !!! Спасибо за столь нужный совет ))) непременно им воспользуюсь !!!
Заранее спасибо за ответ !!!


уважаемый камрад TITAMIN.
Для того, что бы вам могли помочь - нужно как минимум внятно описать проблему ("Но в семерке тупо не приходит" - это к сожалению не слишком внятное описание) и привести фрагмент кода, который, как вы считаете является источником проблемы (либо по меньшей мере позволяет проверить действительное существование ее).
Поймите одну простую вещь - может (да почти наверно) вы не плохой человек и специалист - но на форуме к сожалению все никак не запустят сервис "Телепат" - а догадываться, как что и почему вы делаете - ну лично у меня нет не времени, не желания. Наличие кода и четкое описание - это не всегда гарантированная помощь, но по крайней мере, тот кто будет вам помогать - хотябы будет понимать что у вас происходит.

21K
05 марта 2010 года
TITAMIN
58 / / 24.07.2008
Уважаемый kot_, я не понимаю смысловой нагрузки вашего письма... Если вы хотели мне объяснить, что я не прав, написали бы в "личку" че флудить?
Ваше письмо попадает четко под правило №12!!!
Mhael, на самом деле решил проблему!!! Проблема заключалась в следующем:
как вы и сказали наши реализации отличаются лишь способом ловли сообщений - вот в этом и загвоздка... Маленький эксперимент меняю функцию PretranslateMessage() на:
 
Код:
BOOL CClassDlg::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult) {
    switch(message) {
        case WM_DEVICECHANGE:
            ла ла ла...
            *pResult = 0;    
            break;
        }
        return CDialog::OnWndMsg(message, wParam, lParam, pResult);
    }


и вуаля!!! Работает и там и там !!!
В принципе Тему можно считать закрытой, единственное было бы чудненько, если бы кто-нибудь пояснил происходящее(разницу между этими функциями получения сообщений)... Почему в семерке в PretranslateMessage() не приходит, но функция отрабатывает("иные" сообщения ловлю), а в XP ВСЕ работает ... Загадочно как-то...
Заранее спасибо за стоящий ответ!!!
14
05 марта 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата: TITAMIN
было бы чудненько, если бы кто-нибудь пояснил происходящее(разницу между этими функциями получения сообщений)...


Разберитесь в разнице между SendMessage() и PostMessage()

21K
10 марта 2010 года
TITAMIN
58 / / 24.07.2008
В принципе я представляю разницу между SendMessage & PostMessage первое посылает сообщение непосредственно получателю дожидаясь в течении 5 секунд подтверждения, второе же напротив не дожидается, и ставит в конец очереди получателя это сообщение...

Получатель:
PeekMessage выгребает сообщение из очереди
TranslateMessage преобразует виртуальные давилки в символьные DispatchMessage передает сообщение кому надо... PretranslateMessage стоит в цикле обработки сообщений до TranslateMessage ... тем самым позволяет сотворить с сообщение что нам надо!!!
То есть судя из вашего предложения "понять разницу между этими сообщениями" следует, что PretranslateMessage обрабатывает сообщения из очереди ...от PostMessage...

А OnWndMsg вызывается на прямое получение сообщения методом SendMessage().
При этом системой вызывается оконная процедура WindowProc(), минуя очередь, а она уже вызывает OnWndMsg()!!!
Таким образом можно сделать вывод, что в версиях Виндовс до Виста - это сообщение помещалось в очередь сообщений, а с Виста посылается напрямую...
И я просто искал сообщение в очереди где его не могло быть!!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог