Форум: "WinAPI";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
ВнизПроблема с остановкой хука!! Найти похожие ветки
← →
grigory © (2005-07-11 17:41) [0]Привет всем! Проблема следующая..нужно в определенном месте снять хук, а затем после выполнения процедуры вновь его запустить! Вот у меня даже снять не получается. Прошу помогите..вод часть кода
function SysMsgProc(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var f:textfile;
windtext:array [0..255] of char;
filedir,str:string;
begin
result:=callnexthookex(syshook,code,wparam,lparam);
case code of
HCBT_DESTROYWND: begin
str:="";
wnd:=wparam;
if wnd<>0 then getwindowtext(wnd,windtext,255);
str:=windtext;
if length (str)>0 then
if StrPos(Pchar(str),Pchar("Outlook"))<>nil then
if (StrPos(Pchar(str),Pchar("Down"))<>nil) or
(StrPos(Pchar(str),Pchar("Завершение"))<>nil) then begin
RunStopHook(false);
OIK; {!!!! - процедура подсоединения к базе и считывания данных}
RunStopHook(true)
end;
end;
end;
end;
function runstophook(hook:boolean;):boolean; export;stdcall;
begin
Result:=false;
if Hook and (SysHook=0) then begin
syshook:=setwindowshookex(wh_cbt,@sysmsgproc,hinstance,0);
Result:=(SysHook<>0);
end
else if (hook=false) and (SysHook<>0) then begin
UnhookWindowsHookEx(SysHook);
SysHook:=0;
Result:=true;
end;
end;
здесь во-первых внутри функции-фильтра sysmsgproc вызов функции runstophook невозможен,т.к. она описана позже..ставить forward как-то не хочется. Да и вобще правильно ли из функции-фильтра вызывать runstophook? Вобщем совсем запутался и не знаю как снять хук:( если не снять то происходит зацикливание и процедура ОИК выполняется бесконечное количество раз.
← →
Eraser © (2005-07-11 18:00) [1]grigory © (11.07.05 17:41)
Да и вобще правильно ли из функции-фильтра вызывать runstophook?
Нет, т.к. обычный хук выполняется в контексте потока в который он в данный момент внедрён. Используй для коммуникации с "главным" потоком сообщения, для того чтобы снять хук из потока, который его установил.
← →
grigory © (2005-07-11 18:04) [2]Я на эту тему уже думал..наверно мне не хватает знаний. Можно конкретный пример для моего случая..или для другого..неважно.
← →
Eraser © (2005-07-11 18:14) [3]grigory © (11.07.05 18:04) [2]
Примера нету, советую почитать http://rsdn.ru/article/baseserv/winhooks.xml
← →
grigory © (2005-07-12 17:14) [4]Да с этим я вроде разобрался, но вот с сообщениями в осноне приложение...:(
SendMessage(handle, WM_DESTROY, ParamW, Code);
где code = HCBT_DESTROYWND
handle - дискриптор главного приложения, переданный при вызове длл..а вот как обработать это в основной проге?
и что передается в данном случае в ParamW?
Procedure TMainForm.WMDestroy(var Message: TMessage);
Begin
runstophook(false)
End;
← →
Eraser © (2005-07-12 18:33) [5]grigory © (12.07.05 17:14) [4]
WM_DESTROY + F1 - никаких параметров там не передаётся.
А зачем из ловушке посылать приложению сообщения о закрытии окна???
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.038 c