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

Вниз

Проблема с остановкой хука!!   Найти похожие ветки 

 
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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.041 c
14-1123095964
timerlan
2005-08-03 23:06
2005.08.28
есть ли книга задач для Дельфи


1-1123264667
Doplhin1
2005-08-05 21:57
2005.08.28
emoticon


11-1106042777
Эдик
2005-01-18 13:06
2005.08.28
TKOLButton и image


14-1123484215
Ломброзо
2005-08-08 10:56
2005.08.28
Автомобиль как культ


4-1120850307
DelBoy
2005-07-08 23:18
2005.08.28
Как мне окно Word открыть в форме Делфи