Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Plug&Play и DLL [D3, WinXP]


Yosich ©   (2007-04-01 12:29:00) 

Подскажите как мне в моей DLL поставить хук чтобы отследить изменение оборудования. Надо определить когда установлена флэшка в комп.


Сергей М.   (2007-04-02 08:55:00) [1]


> Yosich   (02.04.07 08:29) [6]


И в этомслучае глобальный хук вовсе не нужен.

Достаточно локального хука.

Установить его нужно на основной поток текущего процесса (т.е. процесса Explorer.exe), поскольку твоя dll будет загружаться именно в осн.потоке.


Yosich   (2007-04-02 08:29:00) [2]

у меня смысл всего этого заключается в том, что моя DLL регистрируется в системе и грузится с експлорером. у меня самого приложения так такового и нет, только DLL. какие еще могут быть предложения? я в написании DLL не особо силен поэтому другого варианта не знаю.


Сергей М.   (2007-04-02 08:22:00) [3]


> а вот хотелось бы вот так


А зачем хук-то ? Тем более глобальный ?

Ведь этот код после установки хука будет работать в каждомGUI-приложении !

А тебе достаточно в своемприложении поймать и обработать сообщение WM_DEVICECHANGE - оно посылается системой каждомуприложению, в т.ч. и твоему.

Так что см. [3]


Yosich   (2007-04-02 07:32:00) [4]

а вот хотелось бы вот так. Но не работает!

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
 if code = HC_ACTION then
    if TMsg(Pointer(lParam)^).message = 537 then begin
       //----------
    end;

 Result:= CallNextHookEx(CommonArea^.HookHandlePlugAndPlay, Code, wParam, lParam);
end;

function SetHookPlugAndPlay(Activate : BOOL): BOOL; stdcall; export;
begin
  Result := FALSE;
  if Activate then
  begin
    //GetCurrentThreadId
    CommonArea^.HookHandlePlugAndPlay := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, hInstance, 0);
    Result := (CommonArea^.HookHandlePlugAndPlay <> 0);
  end
  else
  begin
    if CommonArea^.HookHandlePlugAndPlay <> 0 then
    begin
      Result := UnhookWindowsHookEx(CommonArea^.HookHandlePlugAndPlay);
      if Result then
        CommonArea^.HookHandlePlugAndPlay := 0;
    end;
  end;
end;


SlymRO   (2007-04-02 07:16:00) [5]

Yosich   (02.04.07 6:33) [2]
Хук левой прошел :)
type
 TForm1 = class(TForm)
 private
   procedure WMDEVICECHANGE(var Message: TMessage); message WM_DEVICECHANGE;
 end;

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMDEVICECHANGE(var Message: TMessage);
begin
 Application.MessageBox('WMDEVICECHANGE','WMDEVICECHANGE')
end;


Yosich   (2007-04-02 06:33:00) [6]

когда я ставлю хук на сообщений WM_DEVICECHANGE, прога завершается аварийно при отключении/включении флэшки.


Чапаев   (2007-04-01 20:16:00) [7]

А при чём тут DLL? Отлавливай сообщение WM_DEVICECHANGE.


Наверх

Титульная страница Поиск, карта сайта Написать письмо