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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2013, 22:12   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию Проверка на подключение нового устройства

Здравствуйте! Возник такой вопрос: Возможно ли средствами Delphi проверить подключение нового устройства, т.е. вставлена ли флешка в USB-разъем, и наличествует ли диск в приводе
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 22.08.2013, 22:31   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Насчет флешки ищи примеры с WM_DEVICECHANGE
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.08.2013, 22:40   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...насчет устройств вообще, в блоге, ссылка выше.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 22.08.2013, 23:05   #4
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Цитата:
в блоге, ссылка выше.
вы про это?

Цитата:
ищи примеры с WM_DEVICECHANGE

Если да, то дополнительный вопрос: допустим мне нужно проверить условие: если подключено новое оборудование, то работать с консолью, а wm_devicechange-это что такое? модуль, процедура, функция? как с ней обращаться и т.п.
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 23.08.2013, 07:36   #5
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
вы про это?




Если да, то дополнительный вопрос: допустим мне нужно проверить условие: если подключено новое оборудование, то работать с консолью, а wm_devicechange-это что такое? модуль, процедура, функция? как с ней обращаться и т.п.
WM_DEVICECHANGE- это сообщение, которое система посылает, когда в USB-разъем вставляют любое устройство. Для обработки сообщений надо создавать процедуру. с параметрами (msg: TWM_DEVICECHANGE); message WM_DEVICECHANGE. Но я точно не знаю, сработает ли процедура. Если бы это событие было бы описано в messages.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 23.08.2013, 07:49   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...самый примитивный вариант c WM_DeviceChange:
Код:
//------------------------------------------
// Flash USB
// Модуль определения буквы вставленной флешки
// воспроизведения аудио при подключения
// и отключении USB
// Author: Бадло Сергей Григорьевич
// H-page: http://raxp.radioliga.com
// Cистемные требования: NT/XP/7
//------------------------------------------

program flash;

uses Messages,Classes, Windows, mmsystem; 


type

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

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

 TF = class
 protected
  FWnd: HWnd;
  constructor Create;
  destructor Destroy;
  procedure WndProcc(var Msg:TMessage); message WM_DeviceChange;
end;


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

var
  FWnd: HWnd;
  t: tf;
  Msg: tmsg;

{$R *.RES}

// СКЕЛЕТ =====================================================================
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;

constructor TF.Create;
begin
 inherited Create;
 FWnd:= AllocateHWnd(WndProcc);
end;
destructor TF.Destroy;
begin
 inherited Create;
 deAllocateHWnd(fWnd)
end;

procedure tf.WndProcc(var Msg:TMessage);
begin
 with Msg do

 case wParam of
  DBT_DEVICEARRIVAL:
   if PDevBroadcastHdr(lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
    MCISendString(PChar('play ' + '1.mp3'),nil,0,0);//messagebox(fwnd,pchar(GetDrive(PDevBroadcastVolume(Msg. lParam))),'',0)

  DBT_DEVICEREMOVECOMPLETE:
   if PDevBroadcastHdr(lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
    MCISendString(PChar('play ' + '2.mp3'),nil,0,0);

 else Result:= DefWindowProc(FWnd,Msg,wParam,lParam) end
end;




begin
 t:= tf.Create;

 try while GetMessage(Msg, 0, 0, 0) do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg)
 end finally t.destroy end
// END СКЕЛЕТ =================================================================

end.
То же об чем я упомянул относится к SetupAPI и одной из статей в блоге. Если плохо видно:
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 23.08.2013, 07:54   #7
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

У меня на сайте в разделе разработчикам есть готовая реализация для Lazarus. В Delphi все можно и еще проще сделать, с Lazarus приходится опускаться до WinAPI.
Вот функция
Код:
function MyWndProc(my_wnd : HWND; Msg : UINT;
                   my_wparam : WPARAM; my_lparam : LPARAM) : LRESULT; stdcall;
var
  devType : Integer;
  Datos : PDevBroadcastHdr;
begin
  Result := 0;
  case Msg of
    WM_DEVICECHANGE:
    begin
      if (my_wparam = DBT_DEVICEARRIVAL) or (my_wparam = DBT_DEVICEREMOVECOMPLETE) then
      begin
        Datos := PDevBroadcastHdr(Pointer(my_lparam));
        devType := Datos^.dbch_devicetype;
        if devType = DBT_DEVTYP_DEVICEINTERFACE then
        begin
           if my_wparam = DBT_DEVICEARRIVAL then
              ShowMessage('USB устройство подключено')
           else
              ShowMessage('USB устройство отключено');
        end;
      end;
    end; 
  end; 
  Result := Windows.CallWindowProc(OldWndProc, my_wnd, Msg, my_wparam, my_lparam);
end;
kta87 вне форума Ответить с цитированием
Старый 23.08.2013, 08:22   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

http://www.youtube.com/watch?v=4rN87suPnmA
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 23.08.2013, 09:42   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В Delphi все можно и еще проще сделать
Это как, стесняюсь спросить?? Разве в Делфи тоже не придется до WinAPI опускаться?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.08.2013, 11:15   #10
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

Stilet & Др. Дышиглубжиев, проблема в Lazarus в том, что форма не получает WM_DEVICECHANGE вообще. Подробнее смотрите кому интересно тут - моя тема тогда я попытался перенести рабочий отлов USB с delphi в Lazarus.
kta87 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение нового класса без перекомпиляции Хохол Общие вопросы по Java, Java SE, Kotlin 1 16.03.2010 04:34
Проверка на подключение к БД Shtorm_86 БД в Delphi 5 12.01.2009 23:47
Проверка нового файла на ФТП Aleksei Работа с сетью в Delphi 11 10.05.2008 22:26
Подключение нового компонента Makarov Компоненты Delphi 10 18.01.2008 18:01