unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    lbDevice: TListBox;
  private
    {обработчик сообщения WM_DEVICECHANGE}
    procedure WMDEVICECHANGE(var Msg : TWMDeviceChange); message WM_DEVICECHANGE;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{обработчик сообщения WM_DEVICECHANGE}
procedure TForm1.WMDEVICECHANGE(var Msg: TWMDeviceChange);
var
  lpdb  : PDevBroadcastHdr;
  lpdbv : PDevBroadcastVolume;
  lpdbpr: PDevBroadCastPort;
  S : String;
begin
 {Заголовок сообщения}
 lpdb := PDevBroadcastHdr(Msg.dwData);

 {Отображаем код события}
 lbDevice.Items.Add('Обнаружено событие. Код:'+IntToHex(Msg.Event, 4));

 Case Msg.Event of
  DBT_DEVICEARRIVAL: begin {Добавление}
   lbDevice.Items.Add('>Добавлено устройство. Код:'+IntToHex(lpdb^.dbch_devicetype, 4));

   { Новое устройство - порт (последовательный или параллельный) }
   If lpdb^.dbch_devicetype = DBT_DEVTYP_PORT then begin
    lpdbpr:= PDevBroadCastPort(Msg.dwData);
    lbDevice.Items.Add('>>Добавлен порт. Имя:'+WideCharToString(@lpdbpr.dbcp_name));
   End;

   { Новое устройство - логический диск }
   If lpdb^.dbch_devicetype = DBT_DEVTYP_VOLUME then begin
    lpdbv := PDevBroadcastVolume(Msg.dwData);
    lbDevice.Items.Add('>>Добавлен логический диск');
   End;
  End;

  DBT_DEVICEREMOVECOMPLETE: begin {Удаление}
   lbDevice.Items.Add('>Удалено устройство. Код:'+IntToHex(lpdb^.dbch_devicetype, 4));

   { Удаленное устройство - порт (последовательный или параллельный) }
   If lpdb^.dbch_devicetype = DBT_DEVTYP_PORT then begin
    lpdbpr:= PDevBroadCastPort(Msg.dwData);
    lbDevice.Items.Add('>>Удален порт. Имя:'+WideCharToString(@lpdbpr.dbcp_name));
   End;

   { Удаленное устройство - логический диск }
   If lpdb^.dbch_devicetype = DBT_DEVTYP_VOLUME then begin
    lpdbv := PDevBroadcastVolume(Msg.dwData);
    lbDevice.Items.Add('>>Удален логический диск');
   End;
  End;
 End;
 
end;

end.
