Глобальный хук на мышь срабатывает несколько раз в "многооконных" приложениях

Создаю приложение на 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;

Ответы (0 шт):