Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.014 c
9-1161181131
cxvxc
2006-10-18 18:18
2007.09.30
Создать окно которое было бы всегда поверх других?


2-1188644231
17Landgraf
2007-09-01 14:57
2007.09.30
Вопрос по поводу свойства Charset класса TFont


2-1188891080
6aM6y4a
2007-09-04 11:31
2007.09.30
Дизассемблер


10-1137574629
Bratskiy
2006-01-18 11:57
2007.09.30
Поиск в Word


2-1188981955
Bast
2007-09-05 12:45
2007.09.30
idsmtp и idpop3




   Наверх