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.
Świetny kod. Tylko jest takie coś w nim, że zamiast ">" pokazuje się ">", ale dobrze bo Script Kiddies nie będą kopiować :)
Świetny kod. Tylko jest takie coś w nim, że zamiast ">" pokazuje się ">", 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.