Globalny hook klawiatury do przycisku multimedialnego

0

Cześć wszystkim,

Ponownie Google zawiódł. Robię program wywoływany hotkeyem. Mam w DLLu globalny hook klawiatury na WH_KEYBOARD. Na próbę ustawiłem go na przycisk VK_F3, wszystko działa jak należy, a program jak najbardziej związany z wyszukiwaniem więc mi to pasowało. Tyle, że sporo aplikacji używa F3 jako "znajdź następny", więc postanowiłem przerobić hooka na VK_BROWSER_SEARCH.

I tutaj zaczęły się problemy. Program faktycznie reaguje tak jak powinien, ale przy F3 "przerywał łańcuszek" i poprzednio aktywna aplikacja nie dostawała już informacji, że user naciska ten przycisk. Gdy naciskam teraz zakodowany przycisk, program dostaje sygnał i robi co powinien, ale równocześnie przycisk dalej zachowuje swoją starą funkcję (wyszukiwanie przeglądarki).

W KeyboardProc ustawiam Result := 1, ale nie działa. Próbowałem też nie zwracać wyniku, Delphi trochę pyskował ale nawet to nie pomogło. Standardowe szukanie dalej się włącza.

Czy ktoś jest w stanie mi pomóc?

0

KeyboardProc return value:

If the hook procedure processed the message, it may return a nonzero value to prevent the system from passing the message to the rest of the hook chain or the target window procedure.

czyli zwracasz != 0 i lancuszek sie konczy.

0
maxi napisał(a)

W KeyboardProc ustawiam Result := 1, ale nie działa. Próbowałem też nie zwracać wyniku, Delphi trochę pyskował ale nawet to nie pomogło. Standardowe szukanie dalej się włącza.

Więc, tak jak wspomniałem, nie działa i szukam innego rozwiązania.

0

a masz CallNextHookEx na koncu? wrzuc kod.

0
function HookProc(Code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  h: THandle;
begin
  if Code < 0 then
  begin
    Result := CallNextHookEx(GlobalData^.HookHandle, Code, wParam, lParam);
    exit;
  end;

  sendback := true;

  if wParam = VK_BROWSER_SEARCH then
  begin
    h := FindWindow('TfStartS', nil);
    if h <> 0 then
    begin
      PostMessage(h, MsgF3, 0, 0);
      sendback := false;
    end;
  end;

  if sendback then
    Result := CallNextHookEx(GlobalData^.HookHandle, Code, wParam, lParam)
  else
    Result := 1;
end;

Ten sam kod dla VK_F3 działa i faktycznie nie przekazuje nic dalej, działa też np. z VK_PAUSE, problemy zaczynają się przy przyciskach multimedialnych typu VK_BROWSER_SEARCH.

0

moze driver ktory je obsluguje wykonuje akcje w swoim zakresie, wtedy nie mozesz nic zrobic.

0

Możliwe. Klawiatura dosyć stara i na PS/2, standardowy sterownik Microsoftu. Ale może ktoś ma jeszcze jakiś pomysł ;)

0

hmm... a jakby z rejestrze podmienic wpis odpowiedzialny za akcje po nacisnieciu klawisza?
o ile pamietam, w rejestrze sa wpisy odpowiedzialne na reagowanie na klawisze multimedialne...

1 użytkowników online, w tym zalogowanych: 0, gości: 1