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

Вниз

hook: помогите разгадать фокус   Найти похожие ветки 

 
Stanislav_Kopyshev ©   (2004-02-26 12:51) [0]

Помогите, пожалуйста, выяснить причину происходящего. Написал простейшую dll для установки ловушки типа WH_MOUSE. dll экспортирует единственную функцию, которая устанавливает/снимает ловушку. Написал приложение, которое загружает dll и вызывает эту функцию. На WM_LBTNDOWN из dll просто выдается MessageBox. Так вот этот самый MessageBox выскакивает где-то 22 раза ( следующий появляется после закрытия предыдущего (естественно, с помощью клавиатуры) )... Фрагменты кода привожу ниже:

в dll:

//------------------------------------------------------------------------------
function MouseProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin

 if code < 0 then {надо просто вернуть результат вызова CallNextHookEx()}
 begin
   Result:= CallNextHookEx(GlobalData^.MouseHook, code, wParam, lParam);
 end
 else
 begin
   if(code=HC_ACTION)then
   begin
     if(wParam = WM_LBUTTONDOWN)then
     begin
       MessageBox(0, "WM_LBTNDOWN", "!", 0)
     end;
   end;

   Result := CallNextHookEx(GlobalData^.MouseHook, code, wParam, lParam);
 end;
end;

//------------------------------------------------------------------------------
{Процедура установки hook-ов}
procedure hook(switch : Boolean; hMainProg: HWND; dwThreadId:DWORD; setAll: Boolean);stdcall;
begin
 if switch=true then
 begin
   //Устанавливаем hook"и, если они не установлены (switch=true).
   GlobalData^.MouseHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, HInstance, dwThreadId);

   if(GlobalData^.MouseHook = 0)then
   begin
     MessageBox(0, "Ошибка при установке хуков", "!", 0);
   end;
 end
 else
 begin
   //Удаляем hook"и, если они установлены (switch=false).
   if(not UnhookWindowsHookEx(GlobalData^.MouseHook))then
   begin
     MessageBox(0, "Ошибка при удалении хуков", "!", 0);
   end;

 end;
end;

//в приложении

procedure Hook(switch : Boolean; hMainProg: HWND; dwThreadId:DWORD; bAll: Boolean); stdcall; external "hook_dll.dll" name "hook";

...

procedure TForm1.Button1Click(Sender: TObject);
begin
 hook(true,0,0,true);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 hook(false,0,0,true);
end;


 
VMcL ©   (2004-02-26 16:30) [1]

Подозреваю, что у тебя 22 процесса...


 
Stefan   (2004-02-27 19:14) [2]

Дело в том, что когда ты устанавливаешь в системе ловух, эта библиотека (а именно в библиотеке и размещён твой ловух) цепляется ко всем процессам и когда ловится твоё событие, все процессы его вынуждены обработать. Посмотри заголовки твоих MessageBox"ов :)

У меня тоже похожие траблы были. Придумай что-нибудь.


 
Stanislav_Kopyshev ©   (2004-03-04 08:38) [3]

Но вот что интересно. Если заменить MessageBox добавлением записи в текстовый log-файл, то запись добавляется только один раз...



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

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

Наверх




Память: 0.48 MB
Время: 0.024 c
3-1080732484
Lam
2004-03-31 15:28
2004.04.25
Вычитание таблиц


14-1080994553
Romario
2004-04-03 16:15
2004.04.25
Двоично-десятичное представление числа.


8-1073771619
alex-drob
2004-01-11 00:53
2004.04.25
Печать


3-1080545540
Dr.Karter
2004-03-29 11:32
2004.04.25
Работа с базой Access глазами Delphi


4-1077645218
Владимир Березин
2004-02-24 20:53
2004.04.25
Обработка WINDOWS - сообщения