Hook nie działa

0

Mam sobie DLL, a w nim formę. Unit formy ma obsługiwaś hooka. Po wduszeniu Ctrl ma się wyłączyś Timer (głwnie o to mi chodzi), itp. Fragment kodu widzicie poniżj:

var
  GlobalHook: HHOOK;
  lpWnd: PChar;

function MessageSpy(Code: Integer; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
var
  Buffer : TEventMsg;
  Wnd : array[0..MAX_PATH] of Char;
  Self: TMainForm;
begin
  Result := 0;
  Buffer := PEventMsg(lParam)^;
  if Buffer.Message = WM_KEYDOWN then
  begin
    GetWindowText(Buffer.hwnd, Wnd, SizeOf(Wnd));
    if Wnd <> lpWnd then lpWnd := Wnd;
    if Buffer.paramL = VK_CONTROL then
    begin
      Self.Caption := IntToStr(Buffer.paramL);
      Self.Timer.Enabled := False;
      Paused := True;
    end;
  end;
end;


//W OnCreate:
  GlobalHook := SetWindowsHookEx(WH_JOURNALRECORD, MessageSpy, HInstance, 0);

//W OnDestroy:
  UnhookWindowsHookEx(GlobalHook);

Niby wszystko dobrze, tyle że nie dział :-O. Duszę Ctrl i nic się</ort>nie dzieje :-(. Próowałm z LoWord i HiWord :-/, kodem 2 (Ctrl) oraz 8 i 10 (LCtrl i RCtrl), a także z VK_CONTROL, VK_LCONTROL i VK_RCONTROL. Co jest nie tak [???]. F1, F1, F1!!

0

Jastem rozczarowany. Czy tu nie ma nikogo kto jest kumaty w hookach!? Ja na prawdę potrzebuję pomocy.

0

Hi nie boj sie mi tez kupa osob nie chce odpowiadac na posty :(
Ja sie tez zbytnio nie znam na Hookach, ale:
Ostatnio czytalem arta Jak założyć globalnego hooka? http://4programmers.net/view_faq.php?id=510

Tam bylo co prawda o globalhooku na myszke ale....
HintHook:=SetWindowsHookEx(WH_MOUSE, @MouseHook, Hinstance, 0);

A ty masz:
GlobalHook := SetWindowsHookEx(WH_JOURNALRECORD, MessageSpy, HInstance, 0);

nie wiem czy to jakas roznica (wedlug mnie nie powinno byc zadnej) ale tam jest @ czyli jako sam wskaznik do procedurki.
Zmien, na pewno to nie zaszkodzi programikowi ;))
A czy na pewno WH_JOURNALRECORD to reagowanie na klawisz?? Sproboj moze WH_KEYBOARD, bo to bardziej pasuje (przynajmniej na moj prosty, chlopski i niedoswiadczony umysl ;-D)

0

Hmm... Nie wiem czy to cos da, ale ja przy odczytywaniu wartosci naciśniętego klawisza używam

b:=buffer.paramL mod 256
0

Hmm... Nie wiem czy to cos da, ale ja przy odczytywaniu wartosci naciśniętego klawisza używam

b:=buffer.paramL mod 256

Za bardzo nie wiem bo się nie wczytywałem ale jeżeli paramL jest wielkości bajtu to to polecenie nie daje zupełnie nic natomiast jeżeli jest większe to i tak polecenie mod jest bardzo wolne, polecam zamiast tego

b:=buffer.paramL and $FF
  • wyjdzie na to samo
0

Aby zrobic hooka dla klawiatory (aby byl globalny skorzystaj z mojego artykulu, do ktorego adres juz tu jest podany) do funkcji SetWindowHookEx dodaj stala wh_Keyboard.

Obsluga takiej funkcji powinna wygladac tak:
[code]
function KeyboardHook(nCode: Integer; wParam, lparam: Longint): Longint; stdcall;
begin
Result := CallNextHookEx(HintHook, nCode, wParam, LParam);
if (nCode = 0) then exit
//wparam odpowiada za klawisze wirtualne, jak VK_RETURN , czyli enter
//lparam odpowiada za zdarzenia, czy sa wcisniete klawisze takie jak np ALT czy CONTROL
end;

[/code]

0

Rozwiazalem to tak:

  • olalem hooka
  • dalem na forme Timer
  • w Timerze miedzy innymi:
Timer.Enabled := HiWord(GetKeyState(VK_LCOTROL)) <> 0;

No i dziala [hurra]

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