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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2009, 21:06   #1
Baaandit
Заблокирован
 
Регистрация: 10.11.2009
Сообщений: 99
По умолчанию Вставлена ли флешка

Нашел такой код в интернете,определяет имя вставленной флешки.Можно ли описать процедуру WMDeviceChange без привязке к форме?-Чтоб программа меньше весила.

Код:
type
  TForm1 = class(TForm)
  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
 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
   inherited;
   case Msg.wParam of
      DBT_DEVICEARRIVAL:if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
       begin
         Drive :=GetDrive(PDevBroadcastVolume(Msg.lParam));
         showmessage(drive);
   end;
        end;
 end;

Последний раз редактировалось Stilet; 03.12.2009 в 12:49.
Baaandit вне форума Ответить с цитированием
Старый 02.12.2009, 23:28   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Вариантов как минимум 2: служба и просто программа без формы
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 02.12.2009, 23:37   #3
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Цитата:
Сообщение от Greblin Посмотреть сообщение
Вариантов как минимум 2: служба и просто программа без формы
Исчо можно WND "пустой" зарегить. Распространённая практика... Службы - гемор, никому не нужный.
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 03.12.2009, 12:12   #4
Baaandit
Заблокирован
 
Регистрация: 10.11.2009
Сообщений: 99
По умолчанию

Цитата:
Сообщение от notHaker Посмотреть сообщение
Исчо можно WND "пустой" зарегить. Распространённая практика... Службы - гемор, никому не нужный.
Код можно привести? Хотя бы какой-то пример, с чего вообще начать.

Последний раз редактировалось Baaandit; 03.12.2009 в 12:18.
Baaandit вне форума Ответить с цитированием
Старый 03.12.2009, 12:33   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Нашел такой код в интернете,определяет имя вставленной флешки.Можно ли описать процедуру WMDeviceChange без привязке к форме?
да можно, на api:
Код:
var FWnd: HWnd;
...
// при создании-
FWnd:= AllocateHWnd(WndProc)

procedure WndProc(var Msg:TMessage);
begin
 case Msg.wparam of
    
    DBT_DEVICEARRIVAL: if PDevBroadcastHdr(Msg.lParam)^.dbcd_ devicetype = DBT_DevTyp_Volume then begin
     Drive :=GetDrive(PDevBroadcastVolume(Msg. lParam));
     showmessage(drive);
    end;
 end else Result:= DefWindowProc(FWnd, Msg, wParam, lParam);
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 03.12.2009, 13:37   #6
Baaandit
Заблокирован
 
Регистрация: 10.11.2009
Сообщений: 99
По умолчанию

var FWnd: HWnd;
...
// при создании-
FWnd:= AllocateHWnd(WndProc).
Я так понял-это не весь код который нужен). Можно подронее объяснить,что например делает FWnd:= AllocateHWnd(WndProc).Я так представляю надо создать свой класс средствами API чтоб заработоло или нет? И Result:= DefWindowProc(FWnd, Msg, wParam, lParam).Result вроде только в фунцкциях пишется.
Baaandit вне форума Ответить с цитированием
Старый 03.12.2009, 13:44   #7
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Цитата:
Сообщение от Baaandit Посмотреть сообщение
var FWnd: HWnd;
...
// при создании-
FWnd:= AllocateHWnd(WndProc).
Я так понял-это не весь код который нужен). Можно подронее объяснить,что например делает FWnd:= AllocateHWnd(WndProc).Я так представляю надо создать свой класс средствами API чтоб заработоло или нет?
Да не весь... WND исчо надо закрыть . DeallocateHWnd.
AllocateHWnd создаёт "пустой" WND, по которому можно ловить сообщения.
Можешь класс создать, можешь не создавать (а вабще класс и так создаётся, ток он системный, а ты к нему по дескриптору обращаешся)

Цитата:
Сообщение от Baaandit Посмотреть сообщение
И Result:= DefWindowProc(FWnd, Msg, wParam, lParam).Result вроде только в фунцкциях пишется.
чего??
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 03.12.2009, 13:46   #8
Baaandit
Заблокирован
 
Регистрация: 10.11.2009
Сообщений: 99
По умолчанию

Result-не в функцих только пишется)?
Baaandit вне форума Ответить с цитированием
Старый 03.12.2009, 13:49   #9
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Msg.Result имеется ввиду.
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 03.12.2009, 13:57   #10
Baaandit
Заблокирован
 
Регистрация: 10.11.2009
Сообщений: 99
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
да можно, на api:
Код:
var FWnd: HWnd;
...
// при создании-
FWnd:= AllocateHWnd(WndProc)

procedure WndProc(var Msg:TMessage);
begin
 case Msg.wparam of
    
    DBT_DEVICEARRIVAL: if PDevBroadcastHdr(Msg.lParam)^.dbcd_ devicetype = DBT_DevTyp_Volume then begin
     Drive :=GetDrive(PDevBroadcastVolume(Msg. lParam));
     showmessage(drive);
    end;
 end else Result:= DefWindowProc(FWnd, Msg, wParam, lParam);
Все равно не пойму,как описать это код?
Baaandit вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Флешка не форматировается! РаТи Компьютерное железо 3 03.11.2009 14:37
Флешка Sparky Компьютерное железо 6 05.10.2009 11:57
Поломалась флешка Arigato Компьютерное железо 12 25.05.2009 11:09
Можно ли своей функцей менять цвет ячейки в которую эта фу-я вставлена? maeglah Microsoft Office Excel 3 21.04.2009 05:23
Флешка delphin100 Операционные системы общие вопросы 10 08.01.2008 20:03