Главная страница
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.021 c
1-1184918084
Makhanev Alexander
2007-07-20 11:54
2007.09.30
Restart сервиса...


3-1179472856
Павел Калугин
2007-05-18 11:20
2007.09.30
Можно ли обойтись без курсора?


1-1185132215
atruhin
2007-07-22 23:23
2007.09.30
Создать дубликат компонента в рантайм


15-1188885671
Админ
2007-09-04 10:01
2007.09.30
Ищу софт для FireBird


15-1189001308
AntiUser
2007-09-05 18:08
2007.09.30
Американских водил на алкоголь тестирует "криво написанное" ПО