Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DBT_DEVNODES_CHANGED и подкл\откл флешки, разное количество DBT_DEVNODES_CHANGED 
V
    Опции темы
BEST13
Дата 2.11.2011, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 11.4.2008
Где: Ukraine

Репутация: нет
Всего: нет



Доброго времени суток форумчане,
пишу один проектик, в котором нужно отслеживать подключение флешки и отключение. Сразу говорю, не пытаюсь писать вирус, да бы не было споровsmile 
В DKRB есть такой код:
Код

unit Unit1;   
  
    
interface  
    
uses  
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,   
  Dialogs, MMSystem;   
    
type  
  TForm1 = class(TForm)   
  public  
    procedure CD(var Msg: TMessage); message WM_DEVICECHANGE;   
  end;   
    
const  
  DBT_DEVICEARRIVAL = $8000;   
  DBT_DEVICEREMOVECOMPLETE = $8004;   
  DBT_DEVNODES_CHANGED = $7;   
    
var  
  Form1: TForm1;   
    
implementation  
    
{$R *.dfm}  
    
{ TForm1 }  
    
procedure TForm1.CD(var Msg: TMessage);   
begin  
  case Msg.WParam of  
    DBT_DEVNODES_CHANGED: Caption := 'Flash change';   
    DBT_DEVICEARRIVAL: Caption := 'CD close with new disk';   
    DBT_DEVICEREMOVECOMPLETE: Caption := 'CD open';   
    //DBT_DEVICEARRIVAL: Caption := 'New network disk maped';   
    //DBT_DEVICEREMOVECOMPLETE: Caption := 'Network disk unmaped';   
  else  
    Caption := 'Unknown';   
  end;   
end;   
    


Переделал взял из него только обработку флешки:
Код

if  Msg.WParam = DBT_DEVNODES_CHANGED then

Но, как оказалось этих сообщений приходит, не одно... А 6-7 при подключении и 3 при отключении
И тут не задача мой код толком не будет знать, подключена ли флешка или удалена....
Экспериментным путем выяснил количество приходящих сообщении (указал выше). По этому идея, считать их реагировать не подходит, пока не понятно когда 6, а когда 7 при подключении.
Соответственно вопрос к вам, как можно решить данную проблему? Надеюсь, на вашу помощь.
   
PM MAIL ICQ GTalk   Вверх
BEST13
Дата 2.11.2011, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 11.4.2008
Где: Ukraine

Репутация: нет
Всего: нет



Решил этот вопрос, так :
Код

  end;
  const
  //При подключении или отключении флэшки срабатывает
   DBT_DEVNODES_CHANGED = $7;
 // Код подключения
   Connect = 32768;
 // Код отключения
   Disconnect = 32772;
var
  Form1: TForm1;
  ////Количество сообщений с кодом 7
   Msg7Count:byte=0;
   //Было ли сообщение с кодом 32768 (подключение)
   USBConnected:Boolean=false;
   //Было ли сообщение с кодом 32772 (отключение)
   USBDisconnected:Boolean=false;
...
procedure TForm1.USBStatus(var Msg: TMessage);
begin
if Msg.WParam = DBT_DEVNODES_CHANGED then inc(Msg7Count);
if Msg.WParam = Connect then USBConnected:=true;
if Msg.WParam = Disconnect then USBDisconnected:=true;
if (Msg7Count=6) and (USBConnected) then
 begin
   USBConnected:=false;
   Msg7Count:=0;
    делаем нужное
 end;
if (Msg7Count=3) and (USBDisconnected) then
 begin
   USBDisconnected:=false;
   Msg7Count:=0;
  делаем нужное
 end;
inherited;

end;
 
PM MAIL ICQ GTalk   Вверх
BEST13
  Дата 4.11.2011, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 11.4.2008
Где: Ukraine

Репутация: нет
Всего: нет



И все таки,  вариант выше не подошел, он реагирует на любое USB устройство. 
Вот нашел вроде нужный код:
Код

private
    { Private declarations }
    procedure pWM_DEVICECHANGE(var Msg: TMessage); message WM_DEVICECHANGE;
...
type
  PDEV_BROADCAST_HDR = ^  _DEV_BROADCAST_HDR;

  _DEV_BROADCAST_HDR = record
    dbch_size, dbch_devicetype, dbch_reserved:DWORD;
   end;

  const
  DBT_DEVICEARRIVAL        = $8000;
  DBT_DEVICEREMOVECOMPLETE = $8004;
  DBT_DEVTYP_VOLUME        = 2;
...
procedure TForm1.pWM_DEVICECHANGE(var Msg: TMessage);
begin
 //Провверка на подключение
  if Msg.WParam=DBT_DEVICEARRIVAL then
   if PDEV_BROADCAST_HDR(Msg.LParam)^.dbch_devicetype= DBT_DEVTYP_VOLUME then
     begin
      Memo.Lines.Add('флешку воткнули!');
      ScreenDeblock;
     end;
 // Проверка на отключение
  if Msg.WParam=DBT_DEVICEREMOVECOMPLETE then
   if PDEV_BROADCAST_HDR(Msg.LParam)^.dbch_devicetype= DBT_DEVTYP_VOLUME then
   begin
    Memo.Lines.Add('флешку высунули!');
    ScreenBlock;
   end;
end;
  
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0852 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.