[ anon68680 @ 07.02.2009. 18:32 ] @
Jel zna neko koji win message i kako treba da presretnem da bih uocio nove medije na PCu, tipa floppy, cd, flash drive?
[ obucina @ 07.02.2009. 21:38 ] @
Ovo sam koristio u jednom komercijalnom programu, radi kao sat.
Detektuje USB disk, u DriveLetter je slovo pod kojim se prijavio u sistem. Definicije tipova su prepisane iz JCL biblioteke.


Code:


  TForm1 = class(TForm)
  private
    procedure FOnDeviceChange(var Message: TMessage); message WM_DEVICECHANGE;
  public
  end;

implementation

type
  _DEV_BROADCAST_HDR = record
    dbch_size: DWORD;
    dbch_devicetype: DWORD;
    dbch_reserved: DWORD;
  end;
  {$EXTERNALSYM _DEV_BROADCAST_HDR}
  DEV_BROADCAST_HDR = _DEV_BROADCAST_HDR;
  {$EXTERNALSYM DEV_BROADCAST_HDR}
  PDEV_BROADCAST_HDR = ^DEV_BROADCAST_HDR;
  {$EXTERNALSYM PDEV_BROADCAST_HDR}
  TDevBroadcastHdr = DEV_BROADCAST_HDR;
  PDevBroadcastHdr = PDEV_BROADCAST_HDR;

  PDEV_BROADCAST_VOLUME = ^DEV_BROADCAST_VOLUME;
  {$EXTERNALSYM PDEV_BROADCAST_VOLUME}
  _DEV_BROADCAST_VOLUME = record
    dbcv_size: DWORD;
    dbcv_devicetype: DWORD;
    dbcv_reserved: DWORD;
    dbcv_unitmask: DWORD;
    dbcv_flags: WORD;
  end;
  {$EXTERNALSYM _DEV_BROADCAST_VOLUME}
  DEV_BROADCAST_VOLUME = _DEV_BROADCAST_VOLUME;
  {$EXTERNALSYM DEV_BROADCAST_VOLUME}
  TDevBroadcastVolume = DEV_BROADCAST_VOLUME;
  PDevBroadcastVolume = PDEV_BROADCAST_VOLUME;

procedure TForm1.FOnDeviceChange(var Message: TMessage);
var
  i: Integer;
  DriveLetter: Char;
begin
  inherited;
  if (Message.WParam = $8000) then
  begin
    if (DEV_BROADCAST_HDR(Pointer(Message.LParam)^).dbch_devicetype = $00000002) then
    begin
      i := 65 + Round(Log2(Extended(DEV_BROADCAST_VOLUME(Pointer(Message.LParam)^).dbcv_unitmask + 0.0)));
      DriveLetter := Chr(i);
      // ...
    end;
  end;
end;
[ anon68680 @ 08.02.2009. 15:45 ] @
Zahvaljujem, radi savrseno :)