wysylanie nacisniec klawiszy do gry

0

Witam chciałbym napisać program który łączy się np.: z jakąś prosta grą lub innym programem i wysyła do niej sekwencje wciśnięć klawiszy np.: wciśnięcie klawisza Z. Nie bardzo wiem jak zrealizować takie połączenie.

0

HWND hWindow = FindWindow(NULL,"tytul okna gry");

WPARAM wParam = 64;

SendMessage(hWindow,WM_KEYDOWN,wParam,0);

Przykladowe nacisniecie a

0

Szczerze powiedziawszy nic nie rozumiem z tego. Znam podstawy C++ ( z Symfinii zaczołem obiekty). Czym muszę się zacząć interesować żeby to zrozumieć. Prosił bym o jakieś materiały (najlepiej w języku polskim) i jak ktoś by mógł mi napisać z grubsza co robią te instrukcje, byłbym bardzo wdzęczny. Z góry dziękuję za zainteresowanie.

0

Musisz się zainteresować systemowymi bibliotekami do obsługi klawiatury. :)
Jeżeli używasz windowsa to możesz zrobić tak jak napisał Testowy.

Poczytaj o podstawach WinApi to zrozumiesz ten kod :D
http://darkcult.gamedev.pl/winapi.html

HWND - uchwyt okna
FindWindow - szuka okna o podanym tytule(na balce tytułowej) i zwraca jego uchwyt
SendMessage wysyła komunikat(okna wysylaja i odbieraja komunikaty, za dużo pisania lepiej przeczytać w jakimś tutorialu :D ) .
Parametry:

  1. uchwyt okna do którego ma wysłać
  2. rodzaj komunikatu ( WM_KEYDOWN - wciśnięcie klawisza)
  3. wParam - kod klawisza (kodów szukaj na msdn, hasło virtual scan codes )
  4. lParam - w tym przypadku puste

pozdr.

0

Dzięki wielkie, właśnie zaczołem rozgryzać podany przez Ciebie tutorial. Dodam jeszcze jeden ciekawie napisany: http://guidecpp.cal.pl/
Może komuś się jeszcze przyda :-)

0
Testowy napisał(a)

HWND hWindow = FindWindow(NULL,"tytul okna gry");

WPARAM wParam = 64;

SendMessage(hWindow,WM_KEYDOWN,wParam,0);

Przykladowe nacisniecie a

Kod nie działał, wprowadziłem poprawkę:) klawisz "A" w ASCII to 65 (hex 0x41),a nie 64

HWND hWindow = FindWindow(NULL,"tytul okna gry");
WPARAM wParam = 0x41;
SendMessage(hWindow,WM_KEYDOWN,wParam,0);

A tu moje 2 pytania:

#include <cstdlib>
#include <iostream>
#include <windows.h>
int i;
using namespace std;

int main(int argc, char *argv[])
{
    

HWND hWindow = FindWindow(NULL,"Gra");
WPARAM wParam = 38;
While(i<7)
{
SendMessage(hWindow,WM_KEYDOWN,wParam,0);
i++;
}
    system("PAUSE");
    return EXIT_SUCCESS;
}

1.Czemu postać w grze porusza się tylko raz po siedmiokrotnej symulacji klawisza UP?
2.Jak zrobić by aplikacja symulowała takie wsiśnięcie przez czas 30 sekund?

Ps. przestudiowałem kursy WinApi, ale niestety tam nie ma informacji na ten temat...

0

To zależy od gry, w niektórych tyh głownie opartych o silnik Unreal gdy okno gry jest nieaktywne to gra odbiera jedynie komunikaty co 1s (1s sleep). Jeśli okno ma być aktywne spróbuj SendInput. SendMessage niezawsze działa wpełni dobrze jeśli chodzi o klawisze..

0

To jak to zmodyfikować, tak żeby do Aplikacji o tytule Gra lub klasie gameclass wysyłany był przycisk UP za pomocą sendinput?

PS. Napisałem program, który po naciśnięciu klawisza "UP ARROW" dodaje do licznika 1, jednak za użyciem powyższego kodu nic się nie dzieje...

Link:http://www.speedyshare.com/349171667.html

0

Temat był wiele razy poruszany. Użyj wyszukiwarki, np wyszukaj po słowie "sendinput" http://4programmers.net/Forum/search.php?q=sendinput

0
adf88 napisał(a)

Temat był wiele razy poruszany. Użyj wyszukiwarki, np wyszukaj po słowie "sendinput" http://4programmers.net/Forum/search.php?q=sendinput

Jeśli sam przeszukasz to dowiesz się też, że żaden z nich nie rozwiązał problemu, a jeśli rozwiązał to w beznadziejny sposób bo aplikacja, do której wysyłany jest klawisz musi być aktywna(Pewnie dlatego poruszany był wiele razy). Ja chciałbym robić coś innego przy kompie(np gadać na gg) i jednocześnie żeby mi mój program wysyłał do zminimalizowanej aplikacji klawisze itp...

0

No cóż, okazuje się, że wszystko da się zrobić za pomocą SendMesage/PostMessage, tylko nikt nie pomyślał, że program może wysyłać wiadomości tak szybko, że gra nie wyrabia z ich interpretacją;] Rozwiązanie -Trzeba spowolnić proces wysyłania wiadomości do gry tak aby wyrabiała się z interpretacją;]

U mnie już wszystko działa;]

0

Witam serdecznie,
pozwoliłem sobie podpiąć się pod istniejący topic, ponieważ mam podobny problem :)

Poniższego kodu używam do komunikacji z terminalem AS400 i niby wszystko by było tak jak należy, gdyby nie jeden mały szkopuł :)
A dokładniej chodzi o przypisanie

Klawisz.ki.wVk = 0x041;

Działają mi wszystkie wirtualne klawiusze typu VK_RETURN, funkcyjne F1..F10, numeryczne 0..9 i mała literka a, ale niestety to co najważniejsze czyli reszta alfabetu od A do Z już nie działa. Sprawdziłem już chyba wszystkie możliwe kombinacje kodów ASCII.

Miał już ktoś z Was podobny problem? Może trzeba użyć jakiegoś innego opisu klawiszy? A może ktoś ma jakąś propozycje aby to inaczej rozwiązać?

Z góry dziękuje za wszystkie wskazówki

Pozdrawiam

PS. używając tego samego kodu np. na Notatniku to małe litery a..z są, ale nie mogę wypisać dużych liter alfabetu

 
              HWND hWindow = FindWindow("TERM", 0);

              SetForegroundWindow(hWindow);

              INPUT Klawisz;
              ZeroMemory (&Klawisz, sizeof(INPUT));

              Klawisz.type = INPUT_KEYBOARD;  
              Klawisz.ki.wVk = 0x041;     
              SendInput (1, &Klawisz, sizeof(INPUT));    
              ZeroMemory (&Klawisz, sizeof(INPUT));
            
              Klawisz.type = INPUT_KEYBOARD;       
              Klawisz.ki.wVk = 0x041;          
              Klawisz.ki.dwFlags = KEYEVENTF_KEYUP; 
              SendInput (1, &Klawisz, sizeof(INPUT)); 
0

VirtualKey (VK_) to nie to samo co kod ASCII. faktycznie, niektore kody sa takie same, celowo, ale niemniej to cos innego. Nie jestes w stanie z klawiatury wyslac "dużego A". Jestes w stanie wyslac ciąg nacisniec i puszczen klawiszy. Czyli, A = "shift:down, a:down, a:up, shift:up" albo "capslock:down/up, a:down/up" zakladajac ze akurat toggle capslocka sie wlaczy :) i tak tez musisz to zrobic tutaj: nie masz opcji wysylania "duzego-A", zeby wyslac "ALAMAKOTA" masz wyslac: shift-down, a-l-a-m-a-k-o-t-a(wszyskto down/up), shift-up..
mam nadzieje ze jasne i logiczne?

0

Witam,
dziękuje za odpowiedź, w 100% masz rację

może nie do końca dobrze określiłem mój problem, którym jest brak możliwości wysłania "wciśnięć" klawiszy od b do z.
Jak pracuje na notatniku to wszystko ładnie chodzi, gorzej z tym programem pod który to robię. Jak myślisz, jaki może być tego powód?

Pozdrawiam
Rastos

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