Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Deteccion de Dispositivos USB (https://www.clubdelphi.com/foros/showthread.php?t=36178)

marceloalegre 04-10-2006 13:55:55

Deteccion de Dispositivos USB
 
Buenos Dias:
Estoy necesitando detectar los dispositivos usb conectados a la pc.
He encontrado un componente que es mytec Sytem Info pero es pago, y no se justifica comprarlo ya que este es un desarrollo muy pequeño.

¿Alguien me puede ayudar con este tema?, o recomendarme algun componente de existir?, Gracias Amigos!!

seoane 04-10-2006 14:02:29

Un par de preguntas. Cuando hablas de "dispositivos usb" ¿te refieres a cualquier dispositivo usb (Impresoras, ratones, etc ...) o a memorias usb?, y cuando dices "detectar" ¿te refieres a cuando se conectan o listar los que ya están conectados?

marceloalegre 04-10-2006 14:32:05

El tema es asi: tengo que saber cuando un modem usb se conecta a mi pc.
Si existe algun evento que me notifique de eso seria lo adecuado, sino estaria con un timer pooleando a la espera del dispositivo.

Lo que necesitaria saber para ser bien claros es ej:
cuando un usuario conecta a la pc el dispositivo "motorola usb modem" y a partir de ahi, actuar en consecuencia.

Saludos!

marceloalegre 04-10-2006 17:51:28

He encontrado esto en la web, pero no entiendo como usarlo... lo he instalado como paquete, pero realmente no se como puedo "ejecutarlo",,, quizas si alguien me pueda asistir con esto, pueda ir acercandome a la solución...
Gracias!

Código Delphi [-]
 
// Component to detect when usb devices are connected or disconnected
// using RegisterDeviceNotification

unit U_Usb;

interface

uses
  Windows, Messages, SysUtils, Classes, Forms;

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

  TComponentUSB = class(TComponent)
  private
    FWindowHandle: HWND;
    FOnUSBArrival: TNotifyEvent;
    FOnUSBRemove: TNotifyEvent;
    procedure WndProc(var Msg: TMessage);
    function USBRegister: Boolean;
  protected
    procedure WMDeviceChange(var Msg: TMessage); dynamic;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
    property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
  end;

implementation

constructor TComponentUSB.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FWindowHandle := AllocateHWnd(WndProc);
  USBRegister;
end;

destructor TComponentUSB.Destroy;
begin
  DeallocateHWnd(FWindowHandle);
  inherited Destroy;
end;

procedure TComponentUSB.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 TComponentUSB.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
        if Assigned(FOnUSBArrival) then
          FOnUSBArrival(Self);
      end 
      else 
      begin
        if Assigned(FOnUSBRemove) then
          FOnUSBRemove(Self);
      end;
    end;
  end;
end;

function TComponentUSB.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.

roman 04-10-2006 18:50:33

Yo lo he instalado tal cual lo pusiste aquí y funciona bien. Sólo tienes que programar sus eventos OnUSBArrrival y OnUSBRemoval. Propiamente no hay que "ejecutar" nada, tan sólo con ponerlo en el formulario, el sólo se activa (constructor Create).

Eso sí, imagino que sirve para cualquier dispositivo USB. Yo lo probé con una memoria. No sé si pueda mejorarse para ditinguir una memoria de un módem por ejemplo.

Por cierto, que se parece bastante a mi componente TCDChange :) pero para CDs. Está bueno saberlo para un USB.

// Saludos

seoane 04-10-2006 19:05:16

Cita:

Empezado por roman
Por cierto, que se parece bastante a mi componente TCDChange :) pero para CDs. Está bueno saberlo para un USB.

Es cierto, el mismo mensaje que se utiliza para notificar que se inserto un cd, sirve para otros dispositivo. Lo malo es distinguir cual es, yo estaba buscando en la dirección de listar todos los dispositivos en busca del citado módem. Aunque no se si habrá un método mejor.

marceloalegre 04-10-2006 20:31:13

Upps.. si perdon mi ingenuidad, no habia visto que en mi codigo estaba faltando hacer el register del component.... ahora ya lo tengo funcionando.
Igualmente esto no esta diferenciando que es lo que se esta conectando (dispositivo), voy a ver de chequear el registro para ver de conseguir esa informacion en el momento de que arribe un nuevo dispositivo... combinando cosas creo que vamos a salir a flote ;)

gracias! y seguire viendo como dejar esto andandoooo

FideRosado 18-10-2014 04:24:04

respuesta
 
roman , pon lo que hisistes aca, para aprender...

roman 20-10-2014 18:32:53

Cita:

Empezado por FideRosado (Mensaje 483305)
roman , pon lo que hisistes aca, para aprender...

Ya edité el enlace para que apunte a la ubicación actual.

// Saludos

Rocio90 22-09-2016 13:12:55

Muy util, gracias


La franja horaria es GMT +2. Ahora son las 22:14:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi