Главная страница
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.028 c
1-1081586948
Insert
2004-04-10 12:49
2004.04.25
Проигрывание *.mov


14-1080565676
Shady
2004-03-29 17:07
2004.04.25
Lines created by Pascal


4-1077731833
Labert
2004-02-25 20:57
2004.04.25
Как эффективнее реализовать непрямоугольную кнопку?


3-1080287554
stelius
2004-03-26 10:52
2004.04.25
Как определить принадлежность поля к таблице?


14-1080717976
Nikolay M.
2004-03-31 11:26
2004.04.25
Бильярдные клубы в Москве кто знает?