How to get CD-ROM media change notification
От: critter Россия  
Дата: 12.11.01 17:18
Оценка:
Как узнать что в CD-ROM сменился диск? Помогите плиз!!!

Пробовал через RegisterDeviceNotification но не сумел заставить работать. Как?
Re: How to get CD-ROM media change notification
От: Snax Россия  
Дата: 13.11.01 03:44
Оценка:
Здравствуйте 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;
}
Re[2]: How to get CD-ROM media change notification
От: critter Россия  
Дата: 13.11.01 05:13
Оценка:
Здравствуйте 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>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.