Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Отследить подключение флешки в картридер


Автор: chessnokk 18.6.2011, 13:42


Задача стоит такая отследить подкл флешки. Помог гугл, нашел все работает.
Беда с картридером. при подключении картридера программа высвечивает, что подключено четыре флешки(кол-во портов в картридере).
А надо чтоб она высвечивала только подлюченые флешки. а не пустые порты.
подскажите пожалуйста.
Выкладываю код программы.
Код

const
  DBT_DeviceArrival = $8000;
  DBT_DeviceRemoveComplete = $8004;
  DBTF_Media = $0001;
  DBT_DevTyp_Volume = $0002;

type
  PDevBroadcastHdr = ^TDevBroadcastHdr;
  TDevBroadcastHdr = packed record
    dbcd_size: integer;
    dbcd_devicetype: DWORD;
    dbcd_reserved: DWORD;
  end;

type
  PDevBroadcastVolume = ^TDevBroadcastVolume;
  TDevBroadcastVolume = packed record
    dbcv_size: DWORD;
    dbcv_devicetype: DWORD;
    dbcv_reserved: DWORD;
    dbcv_unitmask: DWORD;
    dbcv_flags: Word;
  end;
var
  Form2: TForm2;

implementation

{$R *.dfm}
function GetDrive(pDBVol: PDevBroadcastVolume): string;
var
  i: Byte;
  Maske: DWORD;
begin



    Maske := pDBVol^.dbcv_unitmask;
    for i := 0 to 25 do
    begin
      if (Maske and 1) = 1 then
        Result := Char(i + Ord('A')) + ':';
      Maske := Maske shr 1;
    end;
end;

procedure TForm2.WMDeviceChange(var Msg: TMessage);
var
  Drive: string;
begin

  case Msg.wParam of
    DBT_DeviceArrival:
      if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
      begin
        ShowMessage(IntToStr(PDevBroadcastHdr(Msg.lParam)^.dbcd_size));
        Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
        ShowMessage('Введен ' + Drive);
      end;
    DBT_DeviceRemoveComplete:
      if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
      begin
        Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
        ShowMessage('Извлечен ' + Drive);
      end;
  end;
end;

Автор: alexnef 20.6.2011, 21:04
Попробуй так 
Код

procedure TForm2.WMDeviceChange(var Msg: TMessage);
var
  Drive: string;
  H: cardinal;
begin
  case Msg.wParam of
    DBT_DeviceArrival:
      if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
      begin
        ShowMessage(IntToStr(PDevBroadcastHdr(Msg.lParam)^.dbcd_size));
        Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
        H:=createfile(pchar(Drive+'\'),
                               GENERIC_READ,
                               FILE_SHARE_READ or FILE_SHARE_WRITE,
                               nil,
                               OPEN_EXISTING,
                               FILE_FLAG_BACKUP_SEMANTICS,
                               0);
        if H<>$ffffffff then      // удалось - значит диск в дисководе есть
           begin 
               ShowMessage('Введен ' + Drive);
               Closehandle(h);
           end
      end;
    DBT_DeviceRemoveComplete:
      if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
      begin
        Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
        ShowMessage('Извлечен ' + Drive);
      end;
  end;
end

Автор: chessnokk 21.6.2011, 14:10
На диск не диск проверку сделал.
Пробмела такая всплыла.
При подкл флешки через картридер, который подкл через USB событие WMDeviceChange не срабатывает.
подскажите как быть?

Автор: alexnef 23.6.2011, 22:14
Логика такая - при подключении картридера запомнить какие диски он добавляет в систему, затем по таймеру в цикле пытаться произвести вышеописанную проверку.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)