Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2008, 17:27   #1
eriser
 
Регистрация: 17.01.2008
Сообщений: 4
По умолчанию Беда с Кардридером при помощи WM_DEVICECHANGE

Пишу программу печати с с любых цифровых носителей.
Код работает нормально с CD, USB.
Отслеживает подключение и отключение при помощи WM_DEVICECHANGE.
Но беда с Кардридером. Он же постоянно подключен и на карточки от фотиков (CF, MS, XD и т.д...)WM_DEVICECHANGE не реагирует.
Windows же отлавливает момент их подключения.
Если я правильно определил, то когда срабатывает автозапуск, появляется окно, где
указана буква диска в который я вставил флешку (как раз то что мне и нужно)
приходит с данными $8002 но если подсовываю это в программу, то не реагирует - возможно это от другого сообщения?
Может есть возможность взять эту букву из окна автозапуска и не заморачиваться на WM_DEVICECHANGE ? Или-же есть ещё какая возможность ?


Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

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

const  
  DBT_DeviceArrival = $8000;
  DBT_DeviceRemoveComplete = $8004;
  DBTF_Media = $0001;
  DBT_DevTyp_Volume = $0002;

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;

var
  Form1: TForm1;


implementation

{$R *.dfm}
 function GetRemovableDrives: string;
var
  d: dword;
  b: byte;
begin
  result := '';
  d := GetLogicalDrives;
  for b := 2 to 26 do
    if 1 shl b and d > 0 then
      if GetDriveType(PChar(chr(b+65)+':\')) = DRIVE_REMOVABLE then
        result := result + chr(b+65)+':\';
end;



function GetDrive(pDBVol: PDevBroadcastVolume): string;
var
  i: Byte;
  Maske: DWORD;
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;

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 :=  Drive;

      end;
    DBT_DeviceRemoveComplete:
      if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
      begin
        Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
        label1.Caption := ' removed from Drive ' + Drive;
      end;
  end;
end;


end.

Последний раз редактировалось rpy3uH; 18.08.2008 в 10:13.
eriser вне форума Ответить с цитированием
Старый 30.01.2008, 17:39   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Честно говоря, Вам наверное, стоит поискать что-нибудь в DeviceIoControl, где-то в районе кодов IOCTL_CHANGER_******, IOCTL_MOUNTDEV_******, IOCTL_SMARTCARD_********. Букву из окна, конечно, можно выдернуть, но что-то это уж слишком вверх ногами получается . Да и автоплей может быть выключен.....

**********************

Нет.. тормознул, вот наверное, что нужно : RegisterDeviceNotification
http://msdn2.microsoft.com/en-us/library/aa363431.aspx

Последний раз редактировалось B_N; 30.01.2008 в 17:51.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Просьба о помощи FirsFire Помощь студентам 1 29.01.2008 14:29
Беда не приходит одна! Tayfun Свободное общение 6 30.12.2007 07:58
беда с курсовой (текстовый редактор) Otorvashka Общие вопросы C/C++ 2 11.12.2007 23:22
Для помощи Антон Шестаков Общие вопросы Delphi 4 23.10.2007 08:19