Jak sprawdzić czy urządzenie usb jest podłączone?

0

Witam.

W jaki sposób sprawdzić programowo czy urządzenie o znanej nazwie jest podłączone i zainstalowane w komputerze? Czyli czy znajduje się na liście menadżera urządzeń? Chodzi mi konkretnie o urządzenia USB (konwertery USB/COM), które pojawiają się na tej liście dopiero w chwili podpięcia ich do kompa.

0

Szczerze mówiąc to może i by się przydało ale wydają mi się to zbyt mocno rozbudowane programy, żeby tylko sprawdzić, czy urządzenie jest podłączone a nie potrafię też wyłyskać tylko tego co potrzeba bo niestety <ort>nierozumię </ort>tego przykładu (powala ilością komentarzy) aczkolwiek na boku będę starał się coś z niego pojąć. dodam tylko, że używam turbo delphi explorer'a w którym nie moę dodawać nowych komponentów.

może ktoś zna prostszy sposób, lub choć z grubsza mi wytłumaczy powyższy przykład ?

0

Ten sam kod, ale ładniej sformatowany:
http://www.swissdelphicenter.ch/torry/showcode.php?id=2211

Tam nie ma co rozumieć.. to wszystko jest potrzebne żeby działało i to wcale nie jest aż tak dużo kodu.. jak nie możesz dodawać komponentów to to przerób na program wystarczy naprawdę tylko kilka zmian :P

Kod programu:

unit Unit1;

interface

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

type

  PDevBroadcastHdr  = ^DEV_BROADCAST_HDR;
  DEV_BROADCAST_HDR = packed record
    dbch_size: DWORD;
    dbch_devicetype: DWORD;
    dbch_reserved: DWORD;
  end;

  PDevBroadcastDeviceInterface  = ^DEV_BROADCAST_DEVICEINTERFACE;
  DEV_BROADCAST_DEVICEINTERFACE = record
    dbcc_size: DWORD;
    dbcc_devicetype: DWORD;
    dbcc_reserved: DWORD;
    dbcc_classguid: TGUID;
    dbcc_name: short;
  end;

const
  GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
  DBT_DEVICEARRIVAL          = $8000;          // system detected a new device
  DBT_DEVICEREMOVECOMPLETE   = $8004;          // device is gone
  DBT_DEVTYP_DEVICEINTERFACE = $00000005;      // device interface class

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure OnUSBArrival(Sender:TObject);
    procedure OnUSBRemove(Sender: TObject);
  private
    FWindowHandle: HWND;
    procedure WndProc(var Msg: TMessage);
    function USBRegister: Boolean;
  protected
    procedure WMDeviceChange(var Msg: TMessage); dynamic;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure  TForm1.OnUSBArrival(Sender:TObject);
begin
  ShowMessage('Podlaczono');
end;

procedure TForm1.OnUSBRemove(Sender:TObject);
begin
  ShowMessage('Odlaczono');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FWindowHandle := AllocateHWnd(WndProc);
  USBRegister;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeallocateHWnd(FWindowHandle);
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
  if (Msg.Msg = WM_DEVICECHANGE) then
  begin
    try
      WMDeviceChange(Msg);
    except
      Application.HandleException(Self);
    end;
  end
  else
    Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;

procedure TForm1.WMDeviceChange(var Msg: TMessage);
var
  devType: Integer;
  Datos: PDevBroadcastHdr;
begin
  if (Msg.wParam = DBT_DEVICEARRIVAL) or (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then
  begin
    Datos := PDevBroadcastHdr(Msg.lParam);
    devType := Datos^.dbch_devicetype;
    if devType = DBT_DEVTYP_DEVICEINTERFACE then 
    begin // USB Device
      if Msg.wParam = DBT_DEVICEARRIVAL then
      begin
        OnUSBArrival(Self);
      end
      else
      begin
        OnUSBRemove(Self);
      end;
    end;
  end;
end;

function TForm1.USBRegister: Boolean;
var
  dbi: DEV_BROADCAST_DEVICEINTERFACE;
  Size: Integer;
  r: Pointer;
begin
  Result := False;
  Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
  ZeroMemory(@dbi, Size);
  dbi.dbcc_size := Size;
  dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
  dbi.dbcc_reserved := 0;
  dbi.dbcc_classguid  := GUID_DEVINTERFACE_USB_DEVICE;
  dbi.dbcc_name := 0;

  r := RegisterDeviceNotification(FWindowHandle, @dbi,
    DEVICE_NOTIFY_WINDOW_HANDLE
    );
  if Assigned(r) then Result := True;
end;

end.
0

Czy kod działa tylko na usb-ki??

0

Kolejny archeolog. Ale jak sobie w dzisiejszych komputerach wyobrażasz wykrywanie urządzeń - nośników w trakcie działania systemu? O ile się orientuje, to podłączenie następuje w zasadzie tylko poprzez USB, bo tak się komunikuje większość urządzen. A i wnioskując z GUID ten kod będzie raczej odpowiedni tylko do urządzeń USB.

1 użytkowników online, w tym zalogowanych: 0, gości: 1