Например, подключение диска (в частности USB флешки) или порта:
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;
// получение имени диска
function GetDiskName(unitmask : Longint) : string;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{обработчик сообщения WM_DEVICECHANGE}
procedure TForm1.WMDEVICECHANGE(var Msg: TWMDeviceChange);
var
lpdb : PDevBroadcastHdr;
lpdbv : PDevBroadcastVolume;
lpdbpr: PDevBroadCastPort;
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('>>Добавлен логический диск. Имя: '+GetDiskName(lpdbv.dbcv_unitmask));
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('>>Удален логический диск. Имя: '+GetDiskName(lpdbv.dbcv_unitmask));
End;
End;
End;
end;
// Маска имени диска. Возвращаемое значение состоит из битов,
// соответствующих именам дисков:
// бит 0=A, бит 1=B, бит 3=C и т.д.
function TForm1.GetDiskName(unitmask : Longint) : string;
var i : Integer;
begin
For i:= 0 to 26 do begin
if ((unitmask and 1) <> 0) then Break;
unitmask:= unitmask shr 1;
End;
Result:= Char(Integer('A')+i);
end;
end.