WM_DEVICECHANGE Message in Windows 7
Даже без регистрации на приход данного сообщения (RegisterDeviceNotification)!!!
Но в семерке тупо не приходит, на Vista не пробывал .
Все перепробывал для семерки - RegisterDeviceNotification в том числе ... Пока ритарический вопрос - в Семерке работать должно ???
Ну и в Vista соответственно ... Заранее спасибо .
Посмотрите какой код ошибки вам возвращает система. Помедитируйте.
С какими правами вы это выполняете? Я только что выполнил под учеткой с правами администратора - все работает.
По поводу прав: Если Вы о смене параметров управления учетными записями - то отключил, учетка админа, плюс тыкал стандартно - контекстное меню с правами админа ...
По поводу ошибки:
Было четко описано в моем вопросе, что я отлавливаю сообщение в PretranslateMessage() - не понимаю какая может быть ошибка ??? - Сообщения нет ... (если не прав - поправте!!! как можно получить код ошибки на не приход сообщения ???) подскажите как это сделать ...
По поводу медитации: совет конечно НУЖНЫЙ !!! Спасибо за столь нужный совет ))) непременно им воспользуюсь !!!
Заранее спасибо за ответ !!!
По поводу прав: Если Вы о смене параметров управления учетными записями - то отключил, учетка админа, плюс тыкал стандартно - контекстное меню с правами админа ...
По поводу ошибки:
Было четко описано в моем вопросе, что я отлавливаю сообщение в PretranslateMessage() - не понимаю какая может быть ошибка ??? - Сообщения нет ... (если не прав - поправте!!! как можно получить код ошибки на не приход сообщения ???) подскажите как это сделать ...
По поводу медитации: совет конечно НУЖНЫЙ !!! Спасибо за столь нужный совет ))) непременно им воспользуюсь !!!
Заранее спасибо за ответ !!!
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 ).
По поводу прав: Если Вы о смене параметров управления учетными записями - то отключил, учетка админа, плюс тыкал стандартно - контекстное меню с правами админа ...
По поводу ошибки:
Было четко описано в моем вопросе, что я отлавливаю сообщение в PretranslateMessage() - не понимаю какая может быть ошибка ??? - Сообщения нет ... (если не прав - поправте!!! как можно получить код ошибки на не приход сообщения ???) подскажите как это сделать ...
По поводу медитации: совет конечно НУЖНЫЙ !!! Спасибо за столь нужный совет ))) непременно им воспользуюсь !!!
Заранее спасибо за ответ !!!
уважаемый камрад TITAMIN.
Для того, что бы вам могли помочь - нужно как минимум внятно описать проблему ("Но в семерке тупо не приходит" - это к сожалению не слишком внятное описание) и привести фрагмент кода, который, как вы считаете является источником проблемы (либо по меньшей мере позволяет проверить действительное существование ее).
Поймите одну простую вещь - может (да почти наверно) вы не плохой человек и специалист - но на форуме к сожалению все никак не запустят сервис "Телепат" - а догадываться, как что и почему вы делаете - ну лично у меня нет не времени, не желания. Наличие кода и четкое описание - это не всегда гарантированная помощь, но по крайней мере, тот кто будет вам помогать - хотябы будет понимать что у вас происходит.
Ваше письмо попадает четко под правило №12!!!
Mhael, на самом деле решил проблему!!! Проблема заключалась в следующем:
как вы и сказали наши реализации отличаются лишь способом ловли сообщений - вот в этом и загвоздка... Маленький эксперимент меняю функцию PretranslateMessage() на:
switch(message) {
case WM_DEVICECHANGE:
ла ла ла...
*pResult = 0;
break;
}
return CDialog::OnWndMsg(message, wParam, lParam, pResult);
}
и вуаля!!! Работает и там и там !!!
В принципе Тему можно считать закрытой, единственное было бы чудненько, если бы кто-нибудь пояснил происходящее(разницу между этими функциями получения сообщений)... Почему в семерке в PretranslateMessage() не приходит, но функция отрабатывает("иные" сообщения ловлю), а в XP ВСЕ работает ... Загадочно как-то...
Заранее спасибо за стоящий ответ!!!
Разберитесь в разнице между SendMessage() и PostMessage()
Получатель:
PeekMessage выгребает сообщение из очереди
TranslateMessage преобразует виртуальные давилки в символьные DispatchMessage передает сообщение кому надо... PretranslateMessage стоит в цикле обработки сообщений до TranslateMessage ... тем самым позволяет сотворить с сообщение что нам надо!!!
То есть судя из вашего предложения "понять разницу между этими сообщениями" следует, что PretranslateMessage обрабатывает сообщения из очереди ...от PostMessage...
А OnWndMsg вызывается на прямое получение сообщения методом SendMessage().
При этом системой вызывается оконная процедура WindowProc(), минуя очередь, а она уже вызывает OnWndMsg()!!!
Таким образом можно сделать вывод, что в версиях Виндовс до Виста - это сообщение помещалось в очередь сообщений, а с Виста посылается напрямую...
И я просто искал сообщение в очереди где его не могло быть!!!