Symulacja klawiszy [Gra]

0

czesc chcialem napisac program który bedzie symulowal naciskane klawisze w pewnej grze online mmo i chcialem was tutaj zapytac co bede potrzebowal lub klasyczny kod w którym bede musial dodac findwindow klienta i te inne prosze o najszybsza odpowiedz !; D

0

zaczekaj na olesio
to jest mistrz m.in od Hook'ów :)

0

nom zaczekam na kolejne odpowiedzi olesio tutaj chyba jest najbardziej pracowity na forum o delphi poniewarz odwala za innych calos kodu... nie wiem jak to zrobic chce zrobic button w którym po kliknieciu bedzie symuowalo dwa przycisky w grze te przyciski to: Ctrl + strzalka w lewo, i to samo i strzalko w prawo z góry dziekuje Za odpowiedzi i pomoc ! ;]

0

Twoje pytanie... Twoje "poniewarz"....:
user image

0

nie no bardziej mi chodzilo o pomoc a nie o "gif'y".... :D

0

Wieleeeee tematów na ten temat na forum
Wieleeeee postów olesia na tym forum
SZUKAJ SZUKAJ SZUKAJ SZUKAJ SZUKAJ SZUKAJ SZUKAJ SZUKAJ SZUKAJ SZUKAJ SZUKAJ...

0

skoro jest juz taki temat i wie ktos gdzie jest to poprosze bardz i link :P szukalem lecz nic nie znalazlem...

0

no patrz, a ja wpisalem 3 slowa w googlach i znalazlem.
znalazlem rowniez odpowiedz wpisujac jedno slowo w wyszukiwarce na forum.
wiec jesli Ty nie umiesz znalezc, to chyba musisz byc naprawde wybitnie uzdolniony na minusie.

0

jezu poprosilem o pomoc czy to takie tródne zlitowac sie ? ;d pisalem ze szukalem pod kilku frazami lecz nie znalazlem chcialem tylko link do tego tematu... PROSZE WAS.

0

nie ma takiego slowa jak "tródne".
napisz gdzie i pod jakimi frazami szukales, bo nie wierze ze to robiles

0

"delphi klawisze" - 40 stron wszystkich nie oblukalem LOL ?
"delphi findwindow klawisze" - nic....
"Delphi symalacja klawiszy" - symulacja tylko w stworzonym programie...
"delphi klawisze i findiwndow" - cos znalazlem lecz to nie to co mogloby mi pomóc

szukalem jak na forum jak i na moim guru google... ;d
jezeli wiesz jak to napisac to podaj mi chociaŻ jakies wskazówki.

0

i kody w pierwszym wyniku pierwszej frazy pod jaka wyszukiwales nie dzialaja?

0

faktycznie znalazlem pare kodów typu "Setwidowforge();" nie wiem czy dobrze napisalem ale cos w tym stylu i inne szukam nadal moze znajde ale jak ktos zna odpowiedz to i tak prosze o pomoc ! Pozdro :D

0

bardzo az strasznie mi na tym zalezy zawsze chcialem takie cos napisac a teraz poznalem 2/4 Podstaw delphi no tylko nie wiem jak dac taki program aby klawisze odwolywaly sie tylko do jednego programu ;] chyba ze jest to o wiele latwiejsze to moze takze odwolywac sie do calego systemu explorera ;p zalezy mi na tym bardzi Prosze o pomoc chce napisac dzis ten program

ps; w oczekiwaniu na zbawce olesio który potrafi Tłumaczyc.

0

Odswierzam ! dalby ktos rade mi dac chcoiarz utywek takiego kodu ?:P znajdywalem kilka kawalków kodów tylko nie wiedzialem jak to połączyc...

0

najpierw sie poucz polskiego bo robisz takie bledy ze powinni Cie pozbawic obywatelstwa...
keybd_event, FindWindow, SetForegroundWindow - to sa funkcje ktorych potrzebujesz.
jesli nie umiesz ich polaczyc tzn ze musisz nauczyc sie podstaw delphi, i wbij sobie do glowy ze nikt nie bedzie tego robil za Ciebie.

0

a jesli je zalatwie połączylbys mi je w jedną całosć ?:P

0

Jeśli nie umiesz sobie poradzić "ze sklejeniem" kodu, najpierw naucz się podstaw programowania.

olesio napisał(a)

A i wiadomo, że zawsze się litowałem, i odpowiadałem na to co powinno trafić do Kosza, ale to się już skończyło.

No nie wiem, może olesio wpadnie tu w jakimś super nastroju i machnie kod, ale raczej bym na to jednak nie liczył...

Podsumowując: Ten wątek się nadaje do kosza

0

znalazlem takie oto kody:

 SetForegroundWindow(Uchwyt);
 

FindWindow("Notepad",nil);

i co ? jeszcze jeden kod mi brakuje ? ulozycie mi to w jedną calos ?:D

0

JEE po długim szukaniu forum znalazlem ten piprzony kod który mi to zrobic tylko ze ja chce zeby on np kliknął CTRl +Q

 var
  HC, Y : HWND;
begin
  HC := FindWindow('Tytyl aplikacj', nil);
  Y := FindWindowEx(HC, 0, 'Tytył 2', nil);
  SendMessage(Y, WM_CHAR, Ord('B'), 0);
  SendMessage(Y, WM_CHAR, Ord('a'), 0);
  SendMessage(Y, WM_CHAR, Ord('h'), 0);
  SendMessage(Y, WM_KEYDOWN, VK_RETURN,0);
end;

no z tym chyba mi juz mozecie pomóc ?:P

0

a tutaj dodam troszeczke wyrazniej :P

var
  HC, Y : HWND;
begin
  HC := FindWindow('TYTUł', nil);
  Y := FindWindowEx(HC, 0, 'Tytyl 2', nil);
  SendMessage(Y, WM_CHAR, Ord('B'), 0);
  SendMessage(Y, WM_CHAR, Ord('a'), 0);
  SendMessage(Y, WM_CHAR, Ord('h'), 0);
  SendMessage(Y, WM_KEYDOWN, VK_RETURN,0);
end; 

i chce zeby program zamiast pisac "Bah" zeby klikal Np. Ctrl lub Shift próbowalem to edytowac lecz zawsze mi cos nie wychodzi wyswietla sie błąd ;/

0

Dopiero niedawno siadłem do "codziennych zaległości" czyli przeglądania forów itp. Do pytającego: dostałes już odpowiedzi, a poza tym nie
traktujesz języka polskiego poważnie, to jak niby ja mam inaczej traktować Twoje zapytania. Poczytaj o SendMessage. To funkcja, ktora do
okien czy kontrolek wysyła komunikaty. Taki sposób jak Ty podałeś zadziała wysylając znaki do kontrolki typu pole edycyjne mniejsze lub te
większe w na przykład Notatniku. Do symulowania wciśnieć klawiszy służy na ogół funkcja Keybd_Event, ale jeżeli wciskasz kombinacje kilku
klawiszy to trzeba najpierw je "wcisnąć" w odpowiedniej kolejności, a później "puścić". Poniżej masz przykład jak mozna "wciskać" polskie
znaki diaktyryczne. A i nie wiem czy się potrzebnie produkuje, bo pewnie wątek pójdzie do kosza prędzej czy później. Chociaż ostatnio to,
póki co, w tym dziale ma miejsce później. Oczywiście poniższy kod może też wciskać inne znaki niż polskie "ogonki" ale będzie to robił i
tak zawsze w taki sposób jakbyś robił to z użyciem AltGr czy tam prawego Alta. Natomiast poczytaj też o funkcjach typu FindWindow, a
także SetForegroundWindow chociażby w msdnie. To dowiesz się do czego one służą, zaś googlując znajdziesz wiele przykładów użycia.
Jest też funkcja SendInput która na przykład okazała się przydatna w przypadku emulatora Amigi WinUAE i wysyłania tam klawiszy, ale
do tej pory nie wiem na przykład jak poza uzyciem AutoHotKey'a wysłać do niej prawy Ctrl, bo żadne sposoby nie działają. Ale to już
sobie pokombinuj dalej samodzielnie. Przykłady znajdziesz w google jak i na tym forum, bo był post w ktorym to bodajże kAzek mój
czy tam kogoś innego podany sposób z dwoma procedurami osobno do "wciskania" i "puszczania" klawiszy scalij w jedną procedurę.

procedure SendPLKey(AChar : Char; Upper : boolean);
begin
  Keybd_Event(VK_CONTROL, 0, 0, 0);
  if Upper then
  begin
    Keybd_Event(VK_SHIFT, 0, 0, 0);
  end;
  Keybd_Event(VK_MENU, 0, 0, 0);
  Keybd_Event(VkKeyScan(AChar), 0, 0, 0);
  Keybd_Event(VkKeyScan(AChar), 0, KEYEVENTF_KEYUP, 0);
  Keybd_Event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
  if Upper then
  begin
    Keybd_Event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
  end;
  Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
end;

EDIT: a i wiem, że miało się skończyć, ale się wyspałem w miarę póki co, to mogę odpisać coś więcej, pytający zapewne i tak
nie potrzebuje tego na zaliczenie, ale nie zmienia to faktu, ze powinien sam poszukać dalej. Dostał już tu aż nadto wskazówek

0

olesio a jak tak na cb oczekiwalem :P jak pisalem up znalazlem kod który dziala tylko ze ja chcę aby klikalo kombinacje CTRL + Q
ale w tym samym czasie nie najpier Q pozniej Ctrl oto kod który uzywam

 var
  HC, Y : HWND;
begin
  HC := FindWindow('tytul', nil);
  Y := FindWindowEx(HC, 0, 'tytul 2', nil);
  SendMessage(Y, WM_CHAR, Ord('B'), 0);
  SendMessage(Y, WM_KEYDOWN, VK_RETURN,0);
end;
0

No to dziwne, że w tej grze działa akurat, bo najpierw wysyłasz klawisz "B" jak do kontrolek edycyjnych, a później
ślesz komunikat o wcisnięciu ENTERa. Nie wiem co chcesz uzyskać, ale czasem gry, a szczegółnie te korzystające z
DitectX nie zareagują. Nawet takie "ql pisanie" jak bd, cb, wgl i tym podobne Tobie nie pomogą. Dostałeś przykład,
jak zasymulować klawisze. Nie podoba się to kombinuj po swojemu - może się w końcu uda. A i mogę się mylić co
do tego, ale nie da się wcisnąc na przykład Ctrl i Q idealnie w tym samym czasie. I na przykład "Total Commander"
na poniższy kod reaguje prawidłowo, pokazując szybki podgląd. To gra też powinna zareagować. Skoro reaguje na
WM_KEYDOWN, to i na Keybd_Event powinna. Poza tym googluj, myśl - nie wklejaj na pałę kodu do czego innego.

//...
const
  AChar = 'Q';
var
  H : HWND;
begin
  H := FindWIndow('TTOTAL_CMD', nil);
  if H > 0 then
  begin
    SetForegroundWindow(H);
    Keybd_Event(VK_CONTROL, 0, 0, 0);
    Keybd_Event(VkKeyScan(AChar), 0, 0, 0);
    Keybd_Event(VkKeyScan(AChar), 0, KEYEVENTF_KEYUP, 0);
    Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
  end;
end;
0

jednak nie... ten kod nie zadzialał pomyslnie.. Próbowalem swoim kodem:

 var
  HC, Y : HWND;
begin
  HC := FindWindow('Gra', nil);
  Y := FindWindowEx(HC, 0, 'GraWersja', nil);
SendMessage(Y, WM_KEYDOWN, VK_CONTROL,0); 
 SendMessage(Y, WM_CHAR, Ord('Q'), 0);
end;

lecz ten kod szaleje... pisze same Q pewnie pierw wciska ctrl puszcza i pózniej Q z tego kodu nic nie wyniknie ?

0

dobra juz sobie poradzilem wpisalem poprosty kod up i 3 inne kodu do 3 timerów i wuala xd wiem ze to lipny sposób no ale jakos doszlem do tego :P pozdrawiam i dzieki za pomoc :D

0

Nie wiem co żeś wykombinowal, że aż trzy timery są Tobie potrzebne, ale jak pasuje Ci efekt końcowy to ok.
Po prostu prawdopodobnie źle "puszczałeś" klawisze albo coś tam jeszcze namieszałeś. A i nie wiem co to za
problematyczna gra, ale jeżeli aktywna była by ta kontrolka do której ślesz komunikaty (o uchwycie zawatym
w zmiennej Y) to kombinacja tych klawiszy by zadziałała. Zauważ, że komunikaty ślesz później do kontorlki,
o uchwycie zawartym w zmiennej Y, także robiąc to z użyciem Keybd_Event powinieneś według mnie - jak i
wszelkiej logiki w tego typu przypadkach, ustawić na nią focus przez SetFocus(Y); no ale widać jak czytałeś
inne tego typu wątki tutaj. Pewnie zaraz napiszesz, że i sposób z SetFocus nie zadziałał, ale wtedy to jakaś
przedziwna gra skoro akceptuje ona dla kontrolki komunikaty, przyjmuje fizyczne wciskanie klawiszy, ale ich
zasymulowanie, przy użyciu funkcji Keybd_Event już ignoruje, jak symuluje ona ich wciskanie i puszczanie.

0

nie no teraz mam tylko jedno banalne pytanie ;d mam na formie CheckBox1 i chce aby po zaznaczeniu timer1.enabled := true
a po odznaczeniu false... cos mi to nie wychodzi xD pomoŻesz? :P

0

Najprościej w OnClick dla CheckBoxa to dać taki kod:

  JakiSTamTimer.Enabled := TCheckBox(Sender).Checked;

I na przyszłośc patrz do Helpa i googluj, kombinując samodzielnie.

0

spoko kombinowalem i nie dawalem rady a jak nie daje rady to wcodze tutaj pisze temat i mój Ból i czekam az wejdzie olesio :D
kazdy zawsze napisze "Google.pl" albo np. "ShowMessage" a to takie prote kody... ja sie ogólnie uczylem kodów z gotowców ;P
no teraz juz wiem o wiele wiecej. Dziekuje za pomoc :P

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