
21.05.2009, 03:24
|
|
Новичок
Регистрация: 18.05.2009
Сообщений: 12
С нами:
8939101
Репутация:
19
|
|
Решение под MFC
Проблему решил. Привожу ниже мануал.
Мини-Мануал для MFC
1) В хайдер мейнфрейма ( MainFrm.h) добавляем в описание класса прототип функции OnDeviceChange (в protected:)
PHP код:
BOOL OnDeviceChange( UINT nEventType, DWORD dwData );
2) В мейнфрейм ( MainFrm.cpp) подключаем хайдер dbt.h
3) Дописываем в карту откликов после //}}AFX_MSG_MAP отклик ON_WM_DEVICECHANGE ()
4) В конец мейнфрейма дописываем следующий код:
PHP код:
bool inline IsBitSet (DWORD64 dwMask, UINT nTHBit)
{
DWORD64 dwBit = 1;
dwBit <<= nTHBit;
dwMask &= dwBit;
return dwMask ? true : false;
}
BOOL CMainFrame::OnDeviceChange( UINT nEventType, DWORD dwData )
{
BOOL bReturn = CWnd::OnDeviceChange (nEventType, dwData);
DEV_BROADCAST_VOLUME *volume = (DEV_BROADCAST_VOLUME *)dwData;
CString log;
if (nEventType == DBT_DEVICEARRIVAL)
{
if (volume->dbcv_devicetype == DBT_DEVTYP_VOLUME)
{
for (int n = 0; n < 32; n++)
{
if (IsBitSet (volume->dbcv_unitmask, n))
{
log.Format ("Drive %c: Inserted\n", n + 'A');
::AfxMessageBox(log);
log.Format ("%c", n + 'A');
// Флешка подключена. Имя флешки в системе содержит строковая переменная log
}
}
}
}
if (nEventType == DBT_DEVICEREMOVECOMPLETE)
{
if (volume->dbcv_devicetype == DBT_DEVTYP_VOLUME)
{
for (int n = 0; n < 32; n++)
{
if (IsBitSet (volume->dbcv_unitmask, n))
{
log.Format ("Drive %c: Removed\n", n + 'A');
::AfxMessageBox(log);
log.Format ("%c", n + 'A');
// Флешка извлечена. Имя флешки в системе содержит строковая переменная log
}
}
}
}
return bReturn;
}
Файл проекта + собранный exe
|
|
|