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;
Это код-набор на языке Delphi, демонстрирующий способ обнаружения подключения или отключения USB-устройства с помощью функции Windows API RegisterDeviceNotification.
Содержание кода:
Определен класс TComponentUSB, который наследуется от TComponent. Он имеет два события: OnUSBArrival и OnUSBRemove, которые вызываются при подключении или отключении USB-устройства соответственно.
В конструкторе компонента создается handle окна с помощью AllocateHWnd и регистрируется уведомление о устройстве с помощью RegisterDeviceNotification.
Метод WndProc обрабатывает сообщения окон, включая сообщение WM_DEVICECHANGE. Когда это сообщение получено, вызывается метод WMDeviceChange.
Метод WMDeviceChange проверяет, является ли сообщение уведомлением о изменении устройства (при подключении или отключении). Если так, то извлекается информация из уведомления и вызывается соответствующее событие (OnUSBArrival или OnUSBRemove) в зависимости от типа уведомления.
Метод USBRegister регистрирует уведомление о устройстве с помощью RegisterDeviceNotification. Он создает структуру DEV_BROADCAST_DEVICEINTERFACE, которая содержит информацию о классе интерфейса устройства и GUID.
Для использования этого кода необходимо создать экземпляр класса TComponentUSB и привязать обработчики к событиям OnUSBArrival и OnUSBRemove. Когда USB-устройство подключается или отключается, соответствующее событие будет вызвано.
Обратите внимание, что этот код требует Delphi 7 или более поздней версии, так как он использует функцию RegisterDeviceNotification, которая была введена в Windows XP.
Определить, когда подключилось или отключилось USB-устройство на Windows-системе с помощью приложения Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.