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

Вниз

Проблемма с глобальными переменными в процедуре хука   Найти похожие ветки 

 
Turbid ©   (2006-04-04 00:15) [0]

Объясните пожалуйста, почему ниже следующий вариант хука работает, но если я объявлю переменную hTargetWnd как глобальную и присвою ей хендл окна вне процедуры MouseProc (оптимизации ради), то она всегда будет равна 0? Вроде понимаю, что это как-то связано с тем, что хук ставится с указателем на эту процедуру и она находится в другом аддресном пространстве, но  до конца осмыслить не получается. Должен же быть способ работы с глобальными переменными внутри это процедуры.

library Hook;

uses
 Windows, Messages, SysUtils;

var
 WheelHook: HHOOK = 0;

function MouseProc(nCode: Integer; wParam: Longint; lParam: Longint): Longint; stdcall;
var
  aCopyData: TCopyDataStruct;
  hTargetWnd: HWND;
begin
 if nCode < 0 then
 begin
   Result := CallNextHookEx(MouseHook, nCode, wParam, lParam);
   Exit;
 end;
 if nCode = HC_ACTION then
   if (TMsg(Pointer(lParam)^).message = WM_MOUSEWHEEL) then
   begin
     ...
     ...
     with aCopyData do
     begin
       dwData := 0;
       cbData := StrLen(PChar("Text Data")) + 1;
      lpData := PChar("Text Data");
     end;
     hTargetWnd := FindWindowEx(0, 0, nil, PChar("MyProgram"));
     SendMessage(hTargetWnd, WM_COPYDATA, 0, Longint(@aCopyData));
 end;
 Result := CallNextHookEx(WheelHook, nCode, wParam, lParam);
end;

procedure SetHook(Flag: Boolean) export; stdcall;
begin
 if Flag = True then
   WheelHook := SetWindowsHookEx(WH_GETMESSAGE, @MouseProc, HInstance, 0)
 else
 begin
   UnhookWindowsHookEx(WheelHook);
   WheelHook := 0;
 end;
end;

exports
 SetHook;

begin

end.


 
Eraser ©   (2006-04-04 00:56) [1]


> Turbid ©   (04.04.06 00:15)


> Вроде понимаю, что это как-то связано с тем, что хук ставится
> с указателем на эту процедуру и она находится в другом аддресном
> пространстве

в правильном направлении понимаешь.
Бороться с этим можно используя трюк с MMF.
Пример вот http://kladovka.net.ru/index.cgi?pid=list&rid=195



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

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

Наверх




Память: 0.47 MB
Время: 0.046 c
3-1147433430
Bless
2006-05-12 15:30
2006.07.16
дабавить поле в dataset на клиенте


11-1130343864
mdw
2005-10-26 20:24
2006.07.16
KOLGraphicEx - есть ли более свежая версия?


6-1141725532
vcat
2006-03-07 12:58
2006.07.16
Компонента


1-1149586836
Dyakon_Frost
2006-06-06 13:40
2006.07.16
Потоки - Загрузка процессора


15-1150318363
Petr V. Abramov
2006-06-15 00:52
2006.07.16
Сколько стоит доехать до Тимково на местном таксисте?