Форум: "Система";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.058 c