Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > WM_DEVICECHANGE


Автор: Dick 21.2.2005, 00:59
Пример:
Код


....

type
 TForm1 = class(TForm)
  ......

 private
   { Private declarations }
   procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;

....

implementation

{$R *.dfm}

procedure TForm1.WMDeviceChange(var Msg: TMessage);
const
  DBT_DEVICEARRIVAL = $8000; // system detected a new device
 DBT_DEVICEREMOVECOMPLETE = $8004;  // device is gone
var
  myMsg: string;
begin
  inherited;
  case Msg.wParam of
    DBT_DEVICEARRIVAL: myMsg  := 'CD inserted!';
    DBT_DEVICEREMOVECOMPLETE: myMsg := 'CD removed!';
  end;
  ShowMessage(myMsg);
end;

......



вот такой простенький пример

в связи с этим вопрос можно ли отследить изменения одного типа устройств smile

Автор: Александра 21.2.2005, 01:47
т.е. что за устройство вызвало событие?

если так, то в lParam передается указатель на DEV_BROADCAST_HDR, его поле dbch_devicetype необходимо проверять на DBT_DEVTYP_VOLUME, если это так то можно из lParam получить указатель уже на структуру DEV_BROADCAST_VOLUME, где в свою очередь dbcv_flags указывает на изменения или CD или сетевого диска. а имя можно получить уже из поля dbcv_unitmask (структура DEV_BROADCAST_VOLUME), где наличие каждого бита указывает как раз на имя диска. А - 0 бит, B - 1 бит и так далее...
Добавлено @ 01:48
спасибо MS за MSDN ))

Автор: Dick 21.2.2005, 01:55
спасибо но я уже написал


Код

type
 TForm1 = class(TForm)
 Label1: TLabel;
 private
   { Private declarations }
  procedure WMDeviceChange(var Msg: TMessage); message WM_DeviceChange;
 public
   { Public declarations }
 end;

const
  DBT_DeviceArrival = $8000;
  DBT_DeviceRemoveComplete = $8004;
  DBTF_Media = $0001;
  DBT_DevTyp_Volume = $0000002; // !!!!!!

type
  PDevBroadcastHdr = ^TDevBroadcastHdr;
  TDevBroadcastHdr = packed record
    dbcd_size: DWORD;
    dbcd_devicetype: DWORD;
    dbcd_reserved: DWORD;
  end;

type
  PDevBroadcastVolume = ^TDevBroadcastVolume;
  TDevBroadcastVolume = packed record
    dbcv_size: DWORD;
    dbcv_devicetype: DWORD;
    dbcv_reserved: DWORD;
    dbcv_unitmask: DWORD;
    dbcv_flags: Word;
  end;

function GetDrive(pDBVol: PDevBroadcastVolume): string;
var
  i: Byte;
  Maske: DWORD;
begin
  if (pDBVol^.dbcv_flags and DBTF_Media) = DBTF_Media then
  begin
    Maske := pDBVol^.dbcv_unitmask;
    for i := 0 to 25 do
    begin
      if (Maske and 1) = 1 then
        Result := Char(i + Ord('A')) + ':';
      Maske := Maske shr 1;
    end;
  end;
end;




procedure TForm1.WMDeviceChange(var Msg: TMessage);
var
  Drive: string;
begin
  case Msg.wParam of
    DBT_DeviceArrival:
      if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
      begin
        Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
        label1.Caption := 'CD inserted in Drive ' + Drive;
      end;
    DBT_DeviceRemoveComplete:
      if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
      begin
        Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
        label1.Caption := 'CD removed from Drive ' + Drive;
      end;
  end;
end;





а теперб вопрос такой, что поставить в константу DBT_DevTyp_Volume, что бы отслеживались изменения Flash Drive smile

Автор: Александра 21.2.2005, 04:08
похоже поможет только эксперемент... ))

Автор: Girder 21.2.2005, 16:30
Цитата
похоже поможет только эксперемент... ))
Я думаю... что он опухнет эксперементировать smile

Писать самому лень smile. Да и примеров в сети полно, например: http://main.soobcha.org/delphi/035.html

Автор: Dick 21.2.2005, 22:49
Цитата(Girder @ 21.2.2005, 16:30)
Цитата
похоже поможет только эксперемент... ))
Я думаю... что он опухнет эксперементировать smile

Писать самому лень smile. Да и примеров в сети полно, например: http://main.soobcha.org/delphi/035.html

я уже опух экспериментировать, их там .... очень много ...
Добавлено @ 22:49
большое спасибо

Автор: GRU 15.3.2005, 13:29
http://rxlib.ru/faqs/Winapifa.htm

Вопрос:
Как корректно определить изменения в оборудовании PlugNPlay?
Ответ:

Пример:

type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
procedure WMDeviceChange(var Message: TMessage);
message WM_DEVICECHANGE;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

const DBT_DEVICEARRIVAL = $8000;
const DBT_DEVICEQUERYREMOVE = $8001;
const DBT_DEVICEQUERYREMOVEFAILED = $8002;
const DBT_DEVICEREMOVEPENDING = $8003;
const DBT_DEVICEREMOVECOMPLETE = $8004;
const DBT_DEVICETYPESPECIFIC = $8005;
const DBT_CONFIGCHANGED = $0018;

procedure TForm1.WMDeviceChange(var Message: TMessage);
var
s : string;
begin
{Do Something here}
case Message.wParam of
DBT_DEVICEARRIVAL :
s := 'A device has been inserted and is now available';
DBT_DEVICEQUERYREMOVE: begin
s := 'Permission to remove a device is requested';
ShowMessage(s);
{True grants premission}
Message.Result := integer(true);
exit;
end;
DBT_DEVICEQUERYREMOVEFAILED :
s := 'Request to remove a device has been canceled';
DBT_DEVICEREMOVEPENDING :
s := 'Device is about to be removed';
DBT_DEVICEREMOVECOMPLETE :
s := 'Device has been removed';
DBT_DEVICETYPESPECIFIC :
s := 'Device-specific event';
DBT_CONFIGCHANGED :
s:= 'Current configuration has changed'
else s := 'Unknown Device Message';
end;
ShowMessage(s);
inherited;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)