Глобальный хук на мышь срабатывает несколько раз в "многооконных" приложениях
Создаю приложение на Delphi - счётчик щелчков мыши. Написал глобальный хук на мышь. Сделал все, как рекомендовано, поместил его в DLL. Отслеживаю, отпускание кнопки (WM_LBUTTONUP
). В "простых" приложениях (Рабочий стол, Notepad, Total Commander) работает без претензий. А вот в сложных многооконных приложениях, например - в любом браузере, в Delphi IDE, срабатывает два раза (считает, как два щелчка). В Microsoft Word, так вообще - то четыре, то девять, то пять.
Пробовал сделать задержку (а ля, дребезг контактов - debounce). Пробовал очищать очередь в обработчике нажатий (счётчик в главной программе - мониторе). Без результатов. Подскажите пожалуйста, идеи или направление мысли куда двигаться.
Код глобального хука в DLL:
// Ловушка отпускания левой кнопки мыши
function GMouse_Hook(Code: Integer; wParam: Word; lParam: LongInt): LongInt; export; stdcall;
var
H: HWND;
x, y: Integer;
HookData: tagMOUSEHOOKSTRUCT;
xy_param: LongInt;
begin
if Code >= 0 then
begin
HookData := PMouseHookStruct(lParam)^;
x := HookData.pt.X;
y := HookData.pt.Y;
xy_param := x shl 16 or y; // передаем координаты как значение, а не как адрес на структуру
if wParam = WM_LBUTTONUP then
begin
H := FindWindow('TfrmGMouseHook', nil);
SendMessage(H, WM_GMOUSEHOOK_UP, 0, xy_param);
end;
Result := 0;
end
else
Result := CallNextHookEx(HookHandle,Code, wParam, lParam);
end;