![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как из Делфи узнать, что к компу подключена флэшка? [D7, WinXP]
Zhekacoder © (2006-05-03 12:16:00)Каким образом можно программно узнать, что к компу подключена флэшка?
Deka (2006-05-04 14:53:00) [1]Возможно в системе может появиться новый логический диск который не будет соотвествовать вставленной флешке. Мне то это все равно, потому-что при появлении диска я просто пересчитываю подключенные к компу фотоаппараты, а вот как гарантировать то, что подключилась именно флешка я не знаю. Возможно можно попробовать прочитать какие-то характеристики каждого логического диска и по ним определиться. Т.е. вместо процедуры сканирования новых фотоаппаратов применить процедуру сканирования дисков с заданными характеристиками. И еще где-то на форуме уже была похожая тема...
И вот ещё...
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=20674
krid24 (2006-05-04 14:43:00) [2]Zhekacoder, в DDK есть пример, который отлавливает подключение/отключение USB устройств. Лежит в NTDDK\SRC\WDM\USB\USBVIEW(или в аналогичных ветках для других DDK)
Deka (2006-05-04 14:42:00) [3]Я работаю с фотоаппаратами. Управляю ими польностью с компьютера. Управление идёт по USB. Мне необходимо было отлавливать момент подключения/отключения фотоаппаратов к компу. При подключении/отключении фотоаппарата в системе появляется/исчезает логический диск соотвествующий памяти фотоаппарата. Вот такой код отлавливает нужный мне момент:
procedure TTimerForm.WMDeviceChange(var aMessage: TMessage);
type
PDevBroadcastHdr = ^DEV_BROADCAST_HDR;
DEV_BROADCAST_HDR = packed record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
end;
const
DBT_DEVICEARRIVAL = $8000;
DBT_DEVICEQUERYREMOVE = $8001;
DBT_DEVICEREMOVECOMPLETE = $8004;
DBT_DEVTYP_VOLUME = $00000002; // Новый логический том
var
devType: DWORD;
begin
// В системе появилось новое устройство.
// Подключение фотоаппарата ВСЕГДА сопровождается появлением в системе
// нового логического диска. Поэтому именно это уведомление ключевое!
inherited;
Case aMessage.wParam of
DBT_DEVICEARRIVAL: begin // Новое устройство готово к работе
devType:= PDevBroadcastHdr(aMessage.LParam)^.dbch_devicetype;
If devType = DBT_DEVTYP_VOLUME then begin
PostMessage(TimerForm.Handle, UM_ScanDevice, 0, 0);
end;
end;
DBT_DEVICEREMOVECOMPLETE: begin // Устройство удалено из системы
devType:= PDevBroadcastHdr(aMessage.LParam)^.dbch_devicetype;
If devType = DBT_DEVTYP_VOLUME then begin
PostMessage(TimerForm.Handle, UM_ScanDevice, 0, 0);
end;
end;
DBT_DEVICEQUERYREMOVE: begin // Устройство скоро будет удалено
devType:= PDevBroadcastHdr(aMessage.LParam)^.dbch_devicetype;
If devType = DBT_DEVTYP_VOLUME then begin
PostMessage(TimerForm.Handle, UM_ScanDevice, 0, 0);
end;
end;
end;
end;
Когда разбирался с этим нашел несколько примеров. В том числе и с регистрацией "ловушки" (получателя уведомлений?) для такого рода событий, но не разобрался зачем он нужен, если и без него работает. Выкинул его и довольствуюсь тем, что написано. В принципе пока работает. Возможно что-то кривовато и кто-то поправит.
Zhekacoder (2006-05-04 11:41:00) [4]Приведите плиз рабочий код, Deka, я это и пытаюсь сделать :-)
begin...end (2006-05-03 13:54:00) [5]WM_DEVICECHANGE ?
n0name (2006-05-03 13:52:00) [6]http://delphimaster.ru/cgi-bin/forum.pl?id=1145187125&n=5
Deka (2006-05-03 13:42:00) [7]Отловить сообщение об изменении логических дисков. По крайней в этой стороне надо искать.