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


Автор: artem1987 26.9.2006, 15:59
у меня возникает при появлении юсб девайсов, а почему с сидиромом не работает?
открытие CDROMа как отследить?

Автор: Snowy 26.9.2006, 16:07
А сидиром у тебя никто не отключал.
А компакт не является устройством.
Потому и не возникает.

Автор: artem1987 26.9.2006, 16:24
ну ладно уж глумиться над студентами...а мне хотьбы и открытие закрытие сидюка проследить, есть варианты?

Автор: Snowy 26.9.2006, 16:57
Есть конечно. WM_DEVICECHANGE.

Автор: Yanis 26.9.2006, 16:59
Цитата(Snowy @  26.9.2006,  17:57 Найти цитируемый пост)
Есть конечно. WM_DEVICECHANGE. 

Открытие сидюка оно не ловит smile

Добавлено @ 17:02 
Хотя написано, что должно слаться DBT_DEVICEREMOVEPENDING, но у меня это сообщение вообще не приходит при открытии/закрытии CD-ROM.

Автор: Snowy 26.9.2006, 17:14
Цитата(Yanis @  26.9.2006,  16:59 Найти цитируемый пост)
Открытие сидюка оно не ловит
Если в нём нет диска, то ясен пень не ловит.
А, если диск вынимаем, то DBT_DEVICEREMOVECOMPLETE без вопросов отрабатывает.

Автор: Yanis 26.9.2006, 17:17
Цитата(Snowy @  26.9.2006,  18:14 Найти цитируемый пост)
Если в нём нет диска, то ясен пень не ловит.

Открытие CD-ROM != извлечение диска
Собственно это больше artem1987 адресовано. Непонятно что он имел ввиду.

Автор: artem1987 26.9.2006, 17:41
Код

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 := 'Device 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 := 'Device removed from Drive ' + Drive;
            end;
  end;
end;

вот это ловит извлечение CDROMA ...но я спрашиваю вот почему
если отключить автозапуск диска (например TweakXP)то эти фии не ловят это событие
а если сделать автозапуск то все нормально, неужели отключение автозапуска просто не передает сообщение
по системе?

Автор: Yanis 26.9.2006, 17:43
Цитата(artem1987 @  26.9.2006,  18:41 Найти цитируемый пост)
неужели отключение автозапуска просто не передает сообщение
по системе?

Скорее всего при отключении этой опции explorer не получает сообщения WM_DEVICECHANGE и не пытается открыть файл autorun.ini и прочитать там параметр open.

Автор: CoreDumped 18.6.2007, 03:31
Получается нет сообщения в ОС Windows, которое позволяет отследить момент выброса/вставки cd или dvd независимо от опции "Автозапуска" Неужели это так??? smile  

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