Как определить подключение устройства к USB??
От: AramKa  
Дата: 03.10.06 11:46
Оценка:
Добрый день господа
помогите решить задачку след плана
Есть USB устройство (чтото тпа флэшки) РАботю сним (читаю / пишу данные) через драйвер LittleUSB (виртуальный COM Порт)
Нужно написать программу которая ловила сообщения отом что к USB Подключенно устройство....
Как можно ето сделать Может кто знает основные подходы кэтому...
Или например может ктонить ловил события подключения обычной флэшки
Re: Как определить подключение устройства к USB??
От: ДимДимыч Украина http://klug.org.ua
Дата: 03.10.06 11:50
Оценка:
Здравствуйте, AramKa, Вы писали:

AK>Нужно написать программу которая ловила сообщения отом что к USB Подключенно устройство....

AK>Как можно ето сделать Может кто знает основные подходы кэтому...

Отлавливать WM_DEVICECHANGE с wParam == DBT_DEVICEARRIVAL
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re: Как определить подключение устройства к USB??
От: serg_fork  
Дата: 03.10.06 11:51
Оценка:
Здравствуйте, AramKa, Вы писали:

AK>Добрый день господа

AK>помогите решить задачку след плана
AK>Есть USB устройство (чтото тпа флэшки) РАботю сним (читаю / пишу данные) через драйвер LittleUSB (виртуальный COM Порт)
AK>Нужно написать программу которая ловила сообщения отом что к USB Подключенно устройство....
AK>Как можно ето сделать Может кто знает основные подходы кэтому...
AK>Или например может ктонить ловил события подключения обычной флэшки

WM_DEVICECHANGE
Можно даже не только USB
Re: Как определить подключение устройства к USB??
От: FoolS.Top Армения  
Дата: 03.10.06 13:24
Оценка:
Здравствуйте, AramKa, Вы писали:

AK>Добрый день господа

AK>помогите решить задачку след плана
AK>Есть USB устройство (чтото тпа флэшки) РАботю сним (читаю / пишу данные) через драйвер LittleUSB (виртуальный COM Порт)
AK>Нужно написать программу которая ловила сообщения отом что к USB Подключенно устройство....
AK>Как можно ето сделать Может кто знает основные подходы кэтому...
AK>Или например может ктонить ловил события подключения обычной флэшки

Для отслеживания подключения и отключения используйте функцию RegisterDeviceNotification, для получения WM_DEVICECHANGE с wParam DBT_DEVICEARRIVAL.
Feierlich, misterioso
Re: Как определить подключение устройства к USB??
От: Pavel_Agurov Россия  
Дата: 06.10.06 05:53
Оценка:
Например, подключение диска (в частности USB флешки) или порта:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, DBT;

type
  TForm1 = class(TForm)
    lbDevice: TListBox;
  private
    // обработчик сообщения WM_DEVICECHANGE
    procedure WMDEVICECHANGE(var Msg : TWMDeviceChange); message WM_DEVICECHANGE;

    // получение имени диска
    function GetDiskName(unitmask : Longint) : string;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{обработчик сообщения WM_DEVICECHANGE}
procedure TForm1.WMDEVICECHANGE(var Msg: TWMDeviceChange);
var
  lpdb  : PDevBroadcastHdr;
  lpdbv : PDevBroadcastVolume;
  lpdbpr: PDevBroadCastPort;
begin
 {Заголовок сообщения}
 lpdb := PDevBroadcastHdr(Msg.dwData);

 {Отображаем код события}
 lbDevice.Items.Add('Обнаружено событие. Код:'+IntToHex(Msg.Event, 4));

 Case Msg.Event of
  DBT_DEVICEARRIVAL: begin {Добавление}
   lbDevice.Items.Add('>Добавлено устройство. Код:'+IntToHex(lpdb^.dbch_devicetype, 4));

   { Новое устройство - порт (последовательный или параллельный) }
   If lpdb^.dbch_devicetype = DBT_DEVTYP_PORT then begin
    lpdbpr:= PDevBroadCastPort(Msg.dwData);
    lbDevice.Items.Add('>>Добавлен порт. Имя:'+WideCharToString(@lpdbpr.dbcp_name));
   End;

   { Новое устройство - логический диск }
   If lpdb^.dbch_devicetype = DBT_DEVTYP_VOLUME then begin
    lpdbv := PDevBroadcastVolume(Msg.dwData);
    lbDevice.Items.Add('>>Добавлен логический диск. Имя: '+GetDiskName(lpdbv.dbcv_unitmask));
   End;
  End;

  DBT_DEVICEREMOVECOMPLETE: begin {Удаление}
   lbDevice.Items.Add('>Удалено устройство. Код: '+IntToHex(lpdb^.dbch_devicetype, 4));

   { Удаленное устройство - порт (последовательный или параллельный) }
   If lpdb^.dbch_devicetype = DBT_DEVTYP_PORT then begin
    lpdbpr:= PDevBroadCastPort(Msg.dwData);
    lbDevice.Items.Add('>>Удален порт. Имя: '+WideCharToString(@lpdbpr.dbcp_name));
   End;

   { Удаленное устройство - логический диск }
   If lpdb^.dbch_devicetype = DBT_DEVTYP_VOLUME then begin
    lpdbv := PDevBroadcastVolume(Msg.dwData);
    lbDevice.Items.Add('>>Удален логический диск. Имя: '+GetDiskName(lpdbv.dbcv_unitmask));
   End;
  End;
 End;
 
end;

// Маска имени диска. Возвращаемое значение состоит из битов,
// соответствующих именам дисков:
// бит 0=A, бит 1=B, бит 3=C и т.д. 
function TForm1.GetDiskName(unitmask : Longint) : string;
var i : Integer;
begin
 For i:= 0 to 26 do begin
  if ((unitmask and 1) <> 0) then Break;
  unitmask:= unitmask shr 1;
 End;
 Result:= Char(Integer('A')+i);
end;

end.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.