Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.30;
Скачать: CL | DM;

Вниз

Plug&Play и DLL   Найти похожие ветки 

 
Yosich   (2007-04-01 12:29) [0]

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


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

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


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

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


 
SlymRO ©   (2007-04-02 07:16) [3]

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 07:32) [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;


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


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


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

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

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

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


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

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


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


> Yosich   (02.04.07 08:29) [6]


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.09.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
2-1189072760
Vlad Oshin
2007-09-06 13:59
2007.09.30
Как получить SQL текст с подставленными параметрами?


15-1188836278
ArtemESC
2007-09-03 20:17
2007.09.30
Опрос


2-1188917942
delphiForever
2007-09-04 18:59
2007.09.30
быстрая работа с графикой без DirectX и OpenGL


15-1188377555
Azize
2007-08-29 12:52
2007.09.30
Хелпы


15-1188750357
ArtemESC
2007-09-02 20:25
2007.09.30
А с вами бывает такое?