Текущий архив: 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.45 MB
Время: 0.008 c