Здравствуйте critter, Вы писали:
C>Как узнать что в CD-ROM сменился диск? Помогите плиз!!!
C>Пробовал через RegisterDeviceNotification но не сумел заставить работать. Как?
Странно. У меня работает на ура.
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter = {0};
HDEVNOTIFY hDevNotify;
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVNODE;
hDevNotify = ::RegisterDeviceNotification(m_hWnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
LRESULT OnPnP(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if (DBT_DEVNODES_CHANGED == wParam)
MessageBox(_T("PnP device inserted or removed"));
else if (DBT_DEVICEARRIVAL == wParam)
MessageBox(_T("CD-ROM or smth inserted"));
else if (DBT_DEVICEREMOVECOMPLETE == wParam)
MessageBox(_T("CD-ROM or smth removed"));
return TRUE;
}
Здравствуйте Snax, Вы писали:
C>>Как узнать что в CD-ROM сменился диск? Помогите плиз!!!
C>>Пробовал через RegisterDeviceNotification но не сумел заставить работать. Как?
S>Странно. У меня работает на ура.
Большое спасибо за ответ. Я продолжу спрашивать, можно? :-)
S>S>DEV_BROADCAST_DEVICEINTERFACE NotificationFilter = {0};
S>HDEVNOTIFY hDevNotify;
S>NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
S>NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVNODE;
По MSDN для данной структуры dbcc_devicetype должно равняться DBT_DEVTYP_DEVICEINTERFACE.
Это первое. Второе вышеприведенный код вставленный в программу, после
вызова RegisterDeviceNotification выдает ассершн.
ASSERT(hDevNotify);
Т.е. hDevNotify == NULL. Стало быть у меня приведенный код не сработал (вызываю из OnInitDialog).
И наконец в MSDN не освещается обработчик OnPnP. Что это за сообщение? Я пробовал сообщение
WM_DEVICECHANGE и обработчик
BOOL CWnd::OnDeviceChange(UINT nEventType, DWORD dwData)
Вот такой код у меня ассершна не выдает, но и сообщение не доходит до приложения.
DEV_BROADCAST_DEVICEINTERFACE Filter;
ZeroMemory(&Filter, sizeof(Filter));
Filter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
Filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
Filter.dbcc_classguid = GUID_DEVCLASS_CDROM;
m_hDevNotify = RegisterDeviceNotification(m_hWnd, &Filter,
DEVICE_NOTIFY_WINDOW_HANDLE);
ASSERT(hDevNotify);
С нетерпением жду ответа.
S>hDevNotify = ::RegisterDeviceNotification(m_hWnd, &NotificationFilter, S>DEVICE_NOTIFY_WINDOW_HANDLE);
S>LRESULT OnPnP(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
S>{
S> if (DBT_DEVNODES_CHANGED == wParam)
S> MessageBox(_T("PnP device inserted or removed"));
S> else if (DBT_DEVICEARRIVAL == wParam)
S> MessageBox(_T("CD-ROM or smth inserted"));
S> else if (DBT_DEVICEREMOVECOMPLETE == wParam)
S> MessageBox(_T("CD-ROM or smth removed"));
S> return TRUE;
S>}
S>