Funkcja WinAPI pozwalająca masowo wpisywać kody w grach

intol

Całkiem niedawno tworzyłem program, który miał mi pomóc we wpisywaniu kodu do gry SimCity 4. Sztuka polegała na tym, aby zasymulować naciśnięcie przez użytkownika klawiszy Ctrl + X, wklejenie ze schowka(kombinacja CTRL + V)(aby było prościej) kodu "weaknesspays", oraz zatwierdzenie klawiszem "ENTER". Następnie cała sprawa zostaje powtórzona dowolną liczbę razy. Taki program może przydać nam się, gdy kod w grze trzeba wpisywać dziesiątki, lub tysiące (sic!) razy. Poniżej zamieszczam kod (w C++, napisany dla C++ Builder'a), aby przedstawić sprawę praktycznie. Po więcej informacji sięgnij do dokumentacji WinAPI. Ponieważ podstawowa funkcja pochodzi z biblioteki Windows'a, program można przełożyć bez problemu na prawie dowolny język programowania.

// zmienna pol bedzie sluzyc nam jako licznik ilosci powtorzen
int pol=0;

/* 
aby calosc powtarzala sie co jakis czas, uzyjemy komponentu TTimer wlasciwos Interval tego komponentu ustawilem na 50 (50/1000 sekundy), ponieważ kod trzeba bylo wpisac duzo razy, w mozliwie najkrotrzym czasie mniejszy interwal niz 50, moglby spowodowac, iz aplikacja nie zdazala by z obsluga komunikatow o nacisnieciu klawiszy
*/

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  pol++; // zwiekszenie licznika pol o 1

  if ( pol < 5000 ) Application->Terminate(); // jezeli licznik powtorzen przekroczy 5000,  konczy program

  int op;

  keybd_event( VK_LCONTROL, 0, 0, 0 ); // wysyla komunikat informujacy o wcisnieciu klawisza (lewy) CTRL
  op = TextToShortCut( "X" ); // funkcja dosc zaimproizowana, zamienia znak X na jego odpowiednik w  wirtualnych
                              //klawiszach
  keybd_event( op, 0, 0, 0 ); // wysyla komunikat informujacy o wcisnieciu klawisza X
  keybd_event( op, 0, KEYEVENTF_KEYUP, 0 ); // wysyla komunikat informujacy o zwolnieniu klawisza X
  keybd_event( VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0 ); // wysyla komunikat informujacy o zwolnieniu klawisza (lewy)
                                                     // CTRL
  keybd_event( VK_LCONTROL, 0, 0, 0 ); // tutaj i dalej analogicznie jak wczesniej
  op = TextToShortCut( "V" );
  keybd_event( op, 0, 0, 0 );
  keybd_event( op, 0, KEYEVENTF_KEYUP, 0 );
  keybd_event( VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0 );
  keybd_event( VK_RETURN, 0, 0, 0 ); // VK_RETURN oznacza w kodzie wirtualnych klawiszy klawisz ENTER
  keybd_event( VK_RETURN, 0, KEYEVENTF_KEYUP, 0 );

}
//---------------------------------------------------------

/*
  tutaj znajduje sie funkcja, ktora wykona sie po nacisnieciu przycisku [Start]. Usypia ona program na 15 sekund,
  a dopiero po tym czasie sprawia aby timer zaczal "tykac"
*/

void __fastcall TForm1::Button1Click(TObject *Sender)
{

  Sleep(15000);
  Timer1->Enabled = true;        
}
//--------------------------------------------------------- 

--
Autor: Mariusz Żurawek (INTOL)
WWW: http://www.zurawek.com
Wszelkie prawa zastrzeżone.

7 komentarzy

Świetny kod. Tylko jest takie coś w nim, że zamiast ">" pokazuje się "&gt", ale dobrze bo Script Kiddies nie będą kopiować :)

Świetny kod. Tylko jest takie coś w nim, że zamiast ">" pokazuje się "&gt", ale dobrze bo Script Kiddies nie będą kopiować :)

Nie lepiej pokazalby ktos jak wyszukac dany ciag bajtow z procesu i zmienic go na inny ? :P i przydaloby sie to nie tylko w grach. BTW jesli ktos zna fajny program do wyszukiwania danych z procesow niech napisze mi bo szukam od dawna czegos takiego ^^

Dobre,
kod bardzo dobry, ale sposob na ochrone przed kopiowniem przez nobow genialny chyba podchwyce.

W Delphi nie ma funkcji TextToShortCut, jak to zrealizować???

pol++; // zwiekszenie licznika pol o 1

if ( pol < 5000 ) Application->Terminate(); // jezeli licznik powtorzen przekroczy 5000, konczy program

albo jestem głupi, albo to się od razu wyłączy.

To jest właśnie ten sposób ochrony przed kopiowaniem.