Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Программирование —› Как поймать момент подключения флешки?
Посл.ответ Сообщение

Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 18 октября 2007 21:26
· Личное сообщение · #1

Собственно вопрос.



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 18 октября 2007 21:32 · Поправил: HandMill
· Личное сообщение · #2

Метод конечно не кошерный, но рабочий =)

DWORD drive_mask = GetLogicalDrives();
while (drive_mask)
{
// проверяем присутствует ли диск (выставлен ли соотв. бит)
if (drive_mask & 1)
// если присутствует то выводим на печать имя и тип диска
{
if (GetDriveType(drive)==DRIVE_REMOVABLE)
{
if (lstrcmp(drive,"a:"))
{
if (lstrcmp(drive,"A:"))
{
Чё-то делаем если это флешка
}
}
}
}

// увеличиваем букву диска и смещаем маску.
++drive[0];
drive_mask >>= 1;
}

Это всё пихаем в бесконечной цикл и ловим момент так сказать =)

-----
все багрепорты - в личные сообщения




Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 19 октября 2007 01:48 · Поправил: ssx
· Личное сообщение · #3

HandMill
жесть
Azur1d
WM_DEVICECHANGE

пример тут www.codeproject.com/system/HwDetect.asp



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 19 октября 2007 01:53
· Личное сообщение · #4

Поставь глобальный хук hhook = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,(HINSTANCE)hm,0);
Вот отрывок из моего исходника Flash Guard Pro (самого первого):

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{if (nCode < 0) return CallNextHookEx(hhook, nCode,wParam, lParam);
MSG *msg= (MSG*)lParam;
if (msg->message==WM_DEVICECHANGE)
{if (!flag)
{UnhookWindowsHookEx(hhook);
ResultSWL=(WNDPROC)SetWindowLong(msg->hwnd,GWL_WNDPROC,(LONG)WinPro c);
flag=true;
return 0;
}
};
return CallNextHookEx(hhook, nCode, wParam, lParam);
}


LRESULT CALLBACK WinProc(HWND hwnd,unsigned int uMsg, WPARAM wParam, LPARAM lParam)
{char Serial[16];
//sprintf(Serial,"%d",wParam);
//FlashLed(2,true);
//MessageBox(hwnd,Serial,"", MB_OK);
if (wParam==DBT_DEVICEARRIVAL)
{DEV_BROADCAST_HDR *MyDevB=(DEV_BROADCAST_HDR*)lParam;
if (MyDevB->dbch_devicetype==DBT_DEVTYP_VOLUME)
{DEV_BROADCAST_VOLUME *MyDevV=(DEV_BROADCAST_VOLUME*)lParam;
if (MyDevV->dbcv_flags!=DBTF_MEDIA && MyDevV->dbcv_flags!=DBTF_NET)
{char DriveName[4];
unsigned long DriveSerial;
DWORD dwFileSystemFlags = 0;
DriveName[0]=FirstDriveFromMask(MyDevV->dbcv_unitmask);
DriveName[1] = ':'; DriveName[2] = '\'; DriveName[3] = 0;
unsigned int DriveTyp;
DriveTyp=GetDriveType(DriveName);
char DriveType[1];
sprintf(DriveType,"%d",DriveTyp);
//MessageBox(hwnd,DriveName,DriveType, MB_OK);
if (DriveTyp==2)
{SetWindowLong(hwnd,GWL_WNDPROC,(long)ResultSWL);
GetVolumeInformation(DriveName,
NULL, 0, &DriveSerial, NULL,
&dwFileSystemFlags, NULL, 0);
char DriveType[1];
sprintf(Serial,"%d",DriveSerial);
sprintf(DriveType,"%d",DriveTyp);
// MessageBox(hwnd,Serial,DriveName, MB_OK);
//PostMessage (hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
//MessageBox(NULL,"Использование на данном ПК сменных носителей ограничено!","Извлеките устройство", MB_OK | MB_SYSTEMMODAL | MB_ICONEXCLAMATION );
}
}
}
return 0;
}
return CallWindowProcA(ResultSWL,hwnd, uMsg, wParam, lParam);}
Тут еще и по серийнику проверяется, разберешься

-----
продавец резиновых утёнков




Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 19 октября 2007 06:13
· Личное сообщение · #5

HandMill, ssx, HiEndsoft, спасибо!


 eXeL@B —› Программирование —› Как поймать момент подключения флешки?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати