2012-01-13 47 views
4

私はDelphiでUSBデバイスを使いこなすのが快適ではないと思っています。デバイスドライバを書くことの詳細については、何も知らないところがあります(GoASMを使ってアセンブリを学ぶときには、USBデバイスの接続/切断時の検出方法は?

デバイスは、USBモデムまたはUSBプリンタのいずれかです。

私が必要とするのは、トピックに向かって行くサンプルコードです。

+2

このhttp://delphiheaven.blogspot.com/2007/03/detect-if-usb-device-is-connected-or.html – PresleyDias

+0

@PresleyDiasを試してください:あなたは移行できますanwserとしてあなたのコメントと私はそれを受け入れることができるように少し精緻化? – menjaraz

+0

@PresleyDias、あなたのリンクからのポストは、USBデバイスの接続/切断の通知に関するものです。私はこの質問が「特定のUSBデバイスが接続されていますか? – TLama

答えて

6

これは、あなたがそうするように、いくつかのシェルスクリプトを使用することができますdetect if usb device is connected

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. 
+0

@Thank you!これは良いスタートとして役立ち、私は今行く方向をはっきりと見ることができます。 – menjaraz

+0

よかった、助けて嬉しい – PresleyDias

0

から取られました。 デバイスが接続されている場合lsusbはこれを表示し、デバイスが切断された後にリストから削除します。 シェルスクリプトでは、古いリストと現在のリストの違いを見つける必要があります。 最後に、このスクリプトをcronジョブとして実行する必要があります。これは頻繁にチェックされます。

よろしく、 バルンParichha

+1

ようこそstackoverflowへようこそ。答えてくれてありがとう。確かに有益ですが、Windows環境でDelphiを使用してusbを検出するケースには当てはまりません。 – menjaraz

関連する問題