Hook na klawiaturę i wklejanie tekstu

0

Cześć
Dorwałem pewien programik który wkleja swój tekst w każde pole edycyjne na którym uaktywniony jest kursor. (program niepolski i bez żródła)
Zgodnie z powiedzeniem Polak potrafi chciałbym rozgryźć na jakiej zasadzie to robi :)
Najciekawsze jest to że wkleja teksty w pola edycyjne wykreowane przez aplet np czata :D
Wiem że kiedyś był poruszany ten temat i padło stwierdzenie ze nie da rady wykryć klasy ani uchwytu pola edycyjnego czata. hmm sam to sprawdzałem i rzeczywiście.. jakby nie dumał zawsze bedzie klasa okna przeglądarki a nie tego
pola edycyjnego.
A jednak ten program jakoś to wykrywa. :O
Wiem że ten program wykorzystuje hooka na klawiaturę i w momencie naciśnięcia "Enter" wkleja tekst w aktywne pole.
Pytanie - jakiej instrukcji , funkcji itp użyć by w przypadku naciśnięcia np F1 by wklejało mój tekst w każde, aktualnie aktywne pole edycyjne ?
Proponuje podjąć ten chyba bardzo trudny temat :)
takie coś nie zdaje egzaminu:

var
 H :HWND;
Begin
 text:= 'jakiś tekst';
  H:= //tu podać właściwy uchwyt
  SendMessage( H,WM_SetText,0,LongInt(text) );
End;

chyba że ktoś zna sposób na pobranie uchwytów do pól edycyjnych wykreowanych przez applety :P

0

jak na mój gust to nie wkleja w aktywne okno tylko po prostu wysyła do systemu serię komunikatów o kolejnych wciśnięciach klawiszy, o ile wierzę w to że pobierze wartość aktywnego pola edycyjnego w IE bo to jest w miarę łatwe to wierzę, to to że w aplecie wykrywa to szczerze wątpie

0

A jednak wysyła do wszystkiego w czym da się pisać, nie pomijając okienek kreowanych przez aplet
demo progamiku jest na stronce:
http://chithai.com/delphi/crazykeyboard.htm
po rozpakowaniu zipa wybrać z demosów TimingDemo/TimingHook
program powoduje dopisane wyrazu "SHIT" (po zakupie licencji można wpisywać dowolny tekst) gdy się wciśnie Enter w wybranym polu edycyjnym :P
Możesz wczytać jakiś czat do IE i sam zobacz

0

Tak jak napisal Adamo ten program wysyla serie klikniec. nie pobiera hooka !.

0

Ok więc jak zasymulować taką serię kliknięć tworzących konkretny napis w aktywnym polu edycyjnym ? (czata)

0
var
   H : HWND;
   Text : string;
begin
   H := WindowFromPoint(Mouse.CursorPos); 
   Text := 'HACKED BY WRK :)';  
SendMessage(H,WM_SetText,0,LongInt(Text));
0
WRK napisał(a)
var
   H : HWND;
   Text : string;
begin
   H := WindowFromPoint(Mouse.CursorPos); 
   Text := 'HACKED BY WRK :)';  
SendMessage(H,WM_SetText,0,LongInt(Text));

przeczytałeś temat ??

type
   TShiftKeyInfo = record
     shift: Byte ;
     vkey: Byte ;
   end;
   ByteSet = set of 0..7 ;

const
   shiftkeys: array [1..3] of TShiftKeyInfo =
     ((shift: Ord(ssCtrl) ; vkey: VK_CONTROL),
     (shift: Ord(ssShift) ; vkey: VK_SHIFT),
     (shift: Ord(ssAlt) ; vkey: VK_MENU)) ;

procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean) ;
var
   flag: DWORD;
   bShift: ByteSet absolute shift;
   j: Integer;
begin
   for j := 1 to 3 do
   begin
     if shiftkeys[j].shift in bShift then
       keybd_event(shiftkeys[j].vkey, MapVirtualKey(shiftkeys[j].vkey, 0), 0, 0) ;
   end;
   if specialkey then
     flag := KEYEVENTF_EXTENDEDKEY
   else
     flag := 0;

   keybd_event(key, MapvirtualKey(key, 0), flag, 0) ;
   flag := flag or KEYEVENTF_KEYUP;
   keybd_event(key, MapvirtualKey(key, 0), flag, 0) ;

   for j := 3 downto 1 do
   begin
     if shiftkeys[j].shift in bShift then
       keybd_event(shiftkeys[j].vkey, MapVirtualKey(shiftkeys[j].vkey, 0), KEYEVENTF_KEYUP, 0) ;
   end;
end;

procedure PostKey(Key: char);
var sst: TShiftState; kl: char;
begin
  sst := [];
  // sst := GetShiftState;
  kl := UpCase(Key);
  if kl = Key then sst := sst + [ssShift];
  PostKeyEx32(Ord(kl), sst, false);
end;


procedure TForm1.Timer1Timer(Sender: TObject);
var i: integer; s: string;
begin
  s := 'To jest tekst';
  for i := 1 to Length(s) do
    PostKey(s[i]);
end;

źródło: http://delphi.about.com/od/adptips2004/a/bltip0604_4.htm

Nie działa dla polskich liter i znaków które się uzyskuje z shiftem itp, żeby z nimi też działało troszkę więcej wystarczy się pomęczyć w procedurze PostKey

0

Dzieki Wam wszystkim [browar] pomysł podsunął mi Admamo [browar]
Zrobiłem globalnego hooka na klawiaturę - dałem to w dll
..i własciwą procedurę wpisywania literka po literce dałem w głownym unicie
działa super.
Tylko ma te wady ze tekst musi być z małej litery i nie wystukuje polskich liter ani innych znaków takich jak klamry <>
ponizej kawałek kodu z głownego unitu:

PROCEDURE TForm1.KeyHookMessage(var message:TMessage);
var
 kod     :array[0..100] of Char;
 a,tekst :string;
 x, znak :Integer;
 opcja   :Byte;
Begin
 GetKeyNameText(Message.LParam,@kod,100);
 if ( (Message.lParam shr 31) and 1 ) = 1 then opcja:= 0            //puszczony
    else if ( (Message.lParam shr 30) and 1 )= 1 then opcja:= 1     //wciśnięty
         else opcja:= 2;                              //trzymany jako wciśnięty
 tekst:= UpperCase(Memo1.Text);
 //jeżeli naciśnięto klawisz "F12" to...
 if (String(kod) = 'F12') and (opcja = 0)  then
   //wywołuje wypisanie zdania literka po literce...
   for x:= 0 to Length(tekst) do
     begin
       a:= tekst[x];
       znak:= Ord(tekst[x]);
       Keybd_Event(znak,0,0,0);                          //naciśnięcie klawisza
       Keybd_Event(znak,0,KEYEVENTF_KEYUP,0);             //puszczenie klawisza
       Sleep(SpinEdit1.Value);
       if (String(kod) = '1') then beep;
   end;

End; //ok Win98/XP

Coby tu ulepszyć lub zmienić by uzyskać polskie litery i mozliwość pisania dużym lub małym fontem , aby nie używać UpperCase ?
Zaznaczam ze imitacja wciśnięcia Capslocka odpada - bo tekst jest pobierany z Memo

0

Z wyświetlaniem dużych, małych i w dodatku polskich literek sobie poradziłem.
Ale nie wyświetlają mi się żadne znaki numeryczne , ani znaki specjalne - jak klamry, przecinek itd...

Podaje przykładowy kod w oparciu o powyższe tu podane kodziki.
Jest to tylko zrobione dla Edita w celu przetestowania.
Proszę zerknijcie - może da radę to jakoś uprościć odpowiednią instrukcją, oraz
może któryś z Was wie jak wyświetlić te znaki o które mi chodzi.

//tu dla przykładu klikając na ten edit zostaje wpisany tekst
procedure TForm1.Edit1Click(Sender: TObject);
var
 tekst :String;
 sst   :TShiftState;
 key   :Char;
 x     :Integer;
 opcja :Byte;
Begin
 Edit1.Text:= '';
 //wypisuje zdania literka po literce...
 tekst:= 'To SĄ polskie Litery  ą ć ę ł ń ó ś ż ź  oraz znaki / < ? ;, {]';
 for x:= 1 to Length(tekst) do
 begin
   key:= #0; opcja:= 0; sst:= [];
   //ustawia opcje dla polskiej litery...
   if (tekst[x] = 'ą') then begin key:= #65; opcja:= 1; end;
   if (tekst[x] = 'Ą') then begin key:= #65; opcja:= 2; end;
   if (tekst[x] = 'ć') then begin key:= #67; opcja:= 1; end;
   if (tekst[x] = 'Ć') then begin key:= #67; opcja:= 2; end;
   if (tekst[x] = 'ę') then begin key:= #69; opcja:= 1; end;
   if (tekst[x] = 'Ę') then begin key:= #69; opcja:= 2; end;
   if (tekst[x] = 'ł') then begin key:= #76; opcja:= 1; end;
   if (tekst[x] = 'Ł') then begin key:= #76; opcja:= 2; end;
   if (tekst[x] = 'ń') then begin key:= #78; opcja:= 1; end;
   if (tekst[x] = 'Ń') then begin key:= #78; opcja:= 2; end;
   if (tekst[x] = 'ó') then begin key:= #79; opcja:= 1; end;
   if (tekst[x] = 'Ó') then begin key:= #79; opcja:= 2; end;
   if (tekst[x] = 'ś') then begin key:= #83; opcja:= 1; end;
   if (tekst[x] = 'Ś') then begin key:= #83; opcja:= 2; end;
   if (tekst[x] = 'ż') then begin key:= #90; opcja:= 1; end;
   if (tekst[x] = 'Ż') then begin key:= #90; opcja:= 2; end;
   if (tekst[x] = 'ź') then begin key:= #88; opcja:= 1; end;
   if (tekst[x] = 'Ź') then begin key:= #88; opcja:= 2; end;


   {TU POWINNY BYĆ KODY znaków specjalnych (oczywiście
    ale nic nie wyświetla :(   przykład: }
   if (tekst[x] = '?') then begin key:= #47; opcja:= 3; end; //kod kropki
   if (tekst[x] = '<') then begin key:= #44; opcja:= 3; end; //kod przecinka
   //itd.. itd...

   //klawisz litery z Altem (polskie litery - male)
   if opcja = 1 then
   begin
     keybd_event(VK_RMENU, 0, 0, 0);                      //naciśnięty lewy Alt
     PostKeyEx32(Ord(key),sst,True);
     keybd_event(VK_RMENU, 0, KEYEVENTF_KEYUP, 0);         //puszczony lewy Alt
   end;
   //klawisz litery z Shiftem i Altem (polskie litery - duze)
   if opcja = 2 then
   begin
     keybd_event(VK_LSHIFT, 0, 0, 0);                   //naciśnięty lewy Shift
     keybd_event(VK_RMENU, 0, 0, 0);                      //naciśnięty lewy Alt
     PostKeyEx32(Ord(key),sst,True);
     keybd_event(VK_RMENU, 0, KEYEVENTF_KEYUP, 0);         //puszczony lewy Alt
     keybd_event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0);      //puszczony lewy Shift
   end;
   //klawisz litery z Shiftem  (znaki specjalne)
   if opcja = 3 then
   begin
     keybd_event(VK_LSHIFT, 0, 0, 0);                   //naciśnięty lewy Shift
     PostKeyEx32(Ord(key),sst,True);
     keybd_event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0);      //puszczony lewy Shift
   end;
   //standardowe litery - duże i małe
   if opcja = 0 then
   begin
     key:= UpCase(tekst[x]);
     if key = tekst[x] then sst:= sst + [ssShift];
     PostKeyEx32(Ord(key),sst,True);
   end;
 end;
End; 
0

co do tego pięknego if then begin end to o case słyszałeś?? a jeszcze lepiej o Ord

0

Słyszałem , słyszałem :D a ten marny kodzik robiony był pośpiesznie na kolanie :P
Teraz go uszczuplę o niepotrzebne pierdoły.
Dziękuje za pomoc ..zwłasza dla Adamo, [browar]
Już po bólu - mam wszystkie literki , znaczki itp - temat zamknięty :)

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