Главная страница
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.025 c
3-1121413900
286
2005-07-15 11:51
2005.08.28
Поиск в текстовом файле


14-1122993094
имя
2005-08-02 18:31
2005.08.28
Русские и иностранцы


3-1121432901
Shama_n
2005-07-15 17:08
2005.08.28
LIKE в MySQL не дружит с параметрами?


3-1121338260
Леонид
2005-07-14 14:51
2005.08.28
Узнать и передать значение если запись с пометкой на удаление...


14-1123170240
Димитрий
2005-08-04 19:44
2005.08.28
Программист vs Инженер-программист