PDA

Ver la Versión Completa : Deteccion de Dispositivos USB


marceloalegre
04-10-2006, 13:55:55
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!



// 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 (http://www.romansg.net/index.php?pg=cdchange) :) pero para CDs. Está bueno saberlo para un USB.

// Saludos

seoane
04-10-2006, 19:05:16
Por cierto, que se parece bastante a mi componente TCDChange (http://romansg.clubdelphi.com/index.php?pg=cdchange) :) 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
roman , pon lo que hisistes aca, para aprender...

roman
20-10-2014, 18:32:53
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