Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Определить когда подключилось/отключилось USB-устройство

Delphi , Файловая система , Порты

Code:

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.
Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php

Это код-набор на языке Delphi, демонстрирующий способ обнаружения подключения или отключения USB-устройства с помощью функции Windows API RegisterDeviceNotification.

Содержание кода:

  1. Определен класс TComponentUSB, который наследуется от TComponent. Он имеет два события: OnUSBArrival и OnUSBRemove, которые вызываются при подключении или отключении USB-устройства соответственно.
  2. В конструкторе компонента создается handle окна с помощью AllocateHWnd и регистрируется уведомление о устройстве с помощью RegisterDeviceNotification.
  3. Метод WndProc обрабатывает сообщения окон, включая сообщение WM_DEVICECHANGE. Когда это сообщение получено, вызывается метод WMDeviceChange.
  4. Метод WMDeviceChange проверяет, является ли сообщение уведомлением о изменении устройства (при подключении или отключении). Если так, то извлекается информация из уведомления и вызывается соответствующее событие (OnUSBArrival или OnUSBRemove) в зависимости от типа уведомления.
  5. Метод USBRegister регистрирует уведомление о устройстве с помощью RegisterDeviceNotification. Он создает структуру DEV_BROADCAST_DEVICEINTERFACE, которая содержит информацию о классе интерфейса устройства и GUID.

Для использования этого кода необходимо создать экземпляр класса TComponentUSB и привязать обработчики к событиям OnUSBArrival и OnUSBRemove. Когда USB-устройство подключается или отключается, соответствующее событие будет вызвано.

Пример использования:

uses
  U_Usb;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyUSBComponent := TComponentUSB.Create(Self);
  MyUSBComponent.OnUSBArrival := OnUSBDeviceArrived;
  MyUSBComponent.OnUSBRemove := OnUSBDeviceRemoved;
end;

procedure TForm1.OnUSBDeviceArrived(Sender: TObject);
begin
  ShowMessage('USB device arrived!');
end;

procedure TForm1.OnUSBDeviceRemoved(Sender: TObject);
begin
  ShowMessage('USB device removed!');
end;

Обратите внимание, что этот код требует Delphi 7 или более поздней версии, так как он использует функцию RegisterDeviceNotification, которая была введена в Windows XP.

Определить, когда подключилось или отключилось USB-устройство на Windows-системе с помощью приложения Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Порты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:55:58/0.0034778118133545/0