Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Получение "ИД оборудования" после подключения/отключения USB [D7, WinXP]


MOM   (06.10.17 15:53

Добрый день.

По сабжу, у меня есть много USB устройств, а контролировать отключение и включение нужно только одного устройства. Флешки и т.п. вынимать можно, но вот со сканером отпечатков пальцев играться нельзя, вот хотелось бы отлавливать таких нарушителей.

Само событие по которому происходит подключение/отключение я нашел, но вот как быть дальше?


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

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;

 TForm1 = class(TForm)
   lst1: TListBox;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   FWindowHandle: HWND;
   procedure WndProc(var Msg: TMessage);
   function USBRegister: Boolean;
   procedure WMDeviceChange(var Msg: TMessage); dynamic;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

const
 GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
 DBT_DEVICEARRIVAL           = $8000;          // system detected a new device
 DBT_DEVICEQUERYREMOVE       = $8001;          // wants to remove, may fail
 DBT_DEVICEQUERYREMOVEFAILED = $8002;          // removal aborted
 DBT_DEVICEREMOVEPENDING     = $8003;          // about to remove, still avail.
 DBT_DEVICEREMOVECOMPLETE    = $8004;          // device is gone
 DBT_DEVTYP_DEVICEINTERFACE  = $00000005;      // device interface class

implementation

{$R *.dfm}

procedure TForm1.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 TForm1.WMDeviceChange(var Msg: TMessage);
var
 devType: Integer;
 Datos: PDevBroadcastHdr;
begin
if (Msg.wParam = DBT_DEVICEARRIVAL) or (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) or (Msg.wParam = DBT_DEVICEQUERYREMOVE) then
begin
  Datos := PDevBroadcastHdr(Msg.lParam);
  devType := Datos^.dbch_devicetype;
  if devType = DBT_DEVTYP_DEVICEINTERFACE then // USB Device
  begin
    if Msg.wParam = DBT_DEVICEARRIVAL then
    begin
      // подключение
    end
    else
    if Msg.wParam = DBT_DEVICEQUERYREMOVE then
    begin
      // запрос на отключение
    end;
    else
    if Msg.wParam = DBT_DEVICEREMOVECOMPLETE then
    begin
      // отключение
    end;
  end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 inherited;
 FWindowHandle := AllocateHWnd(WndProc);
 USBRegister;
end;

function TForm1.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;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 DeallocateHWnd(FWindowHandle);
end;

end.



Смотрю в сторону SetupAPI, только как прикрутить не знаю.


kilkennycat ©   (06.10.17 22:13[1]

http://rouse.drkb.ru/files/devlist.zip


MOM   (13.10.17 16:13[2]

все оказалось на много проще, если интересно пишите


Smile ©   (13.10.17 17:53[3]

> все оказалось на много проще, если интересно пишите

Кому могут быть интересны чужие проблемы? :)


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо