Ĺadny brzuch
Jest taka sprawa: Qmpel i ja uwielbiamy grać w pewną gierkę (Pikaczu, pewnie cześć zna:) Ma ona tylko jedną wadę - nie ma opcji grania przez sieć!! Wpadłem na pomysł, żeby napisać program typu klient-serwer, który przechwytywałby nacisnięte klawisze gracza1 i wysyłałby do gracza2 symulując u niego naciskanie klawiszy przez gracza1. Przechwytywanie klawiszy już mam, zostało tylko wysyłanie (ale to raczej nie problem:) i (tu najgorsze), ta symulacja klawiszy. Ktoś wie, jak to rozwiązać? Albo gdzie szukać rozwiązania?? Będę bardzo wdzięczny!:) Thx z góry!
http://forum.ks-eksp...showtopic=59582
Użytkownik Cyrkiel edytował ten post 17 grudzień 2005, 23:13
OK, thx, ale w założeniu mój program ma być zminimalizowany/w trayu i przesyłać te informacje do aktywnej aplikacji! Jak to zrobić?
Znajdujesz uchwyt okna gry. i wysyłasz do niego:
np:
sendmessage(uchwyt,WM_KEYDOWN,vk_left,0)
sendmessage(uchwyt,WM_KEYUP,vk_left,0)
itd.
odbierasz od gracza1 znaki, wysyłasz sendmessage do gry i to czy twój program będzie zminimalizowany, czy w tray nie ma znaczenia.
Użytkownik johans edytował ten post 18 grudzień 2005, 04:38
Cosik nie działa (poniżej fragment kodu z dll'a obsługującego hak na klawiaturę) :
char tab[256]; wsprintf(tab,"%c",wParam); HWND uchwyt; uchwyt=GetForegroundWindow(); switch (tab[0]) { case 'D': SendMessage(uchwyt,WM_KEYDOWN,VK_LEFT,0); SendMessage(uchwyt,WM_KEYUP,VK_LEFT,0); break; }
Podczas grania, gdy naciskam klawisz D gracz1 i gracz2 powinni równocześnie przesunąć się w lewo - a tak się nie dzieje :( Chyba, że czegoś tu nie rozumiem :)
Użytkownik Buffalo edytował ten post 18 grudzień 2005, 13:49
Cosik nie działa (poniżej fragment kodu z dll'a obsługującego hak na klawiaturę) :
char tab[256]; wsprintf(tab,"%c",wParam); HWND uchwyt; uchwyt=GetForegroundWindow(); switch (tab[0]) { case 'D': SendMessage(uchwyt,WM_KEYDOWN,VK_LEFT,0); SendMessage(uchwyt,WM_KEYUP,VK_LEFT,0); break; }
Podczas grania, gdy naciskam klawisz D gracz1 i gracz2 powinni równocześnie przesunąć się w lewo - a tak się nie dzieje :( Chyba, że czegoś tu nie rozumiem :)
W taki sposób ? :
HWND uchwyt1,uchwyt2; uchwyt1=GetForegroundWindow(); switch (tab[0]) { case 'D': uchwyt2=GetForegroundWindow(); if (uchwyt1==uchwyt2) ShowMessage("OK!"); else ShowMessage("Dupa!"); SendMessage(uchwyt2,WM_KEYDOWN,VK_LEFT,0); SendMessage(uchwyt2,WM_KEYUP,VK_LEFT,0); break;
Inną sprawą jest to, że dla tej gierki (i np. Firefoxa) wyskakuje dwa razy "OK!", dla niektórych pozostałych - tylko raz (?!)
// EDIT :
Zamiast SendMessage dałem
keybd_event(VK_LEFT, MapVirtualKey(VK_LEFT,0), 0, 0); keybd_event(VK_LEFT, MapVirtualKey(VK_LEFT,0), KEYEVENTF_KEYUP, 0);
i działa, ale nie w gierce! :( Może ona nie pobiera klawiszy wprost z kolejki komunikatów, tylko jakoś inaczej....(???)
PS. Dlaczego, to SendMessage nie działa....?
// EDIT2:
Coś zaczęło działać (ale nie do końca poprawnie:) Jak się poddam, to napiszę :)
Użytkownik Buffalo edytował ten post 18 grudzień 2005, 15:43
Inną sprawą jest to, że dla tej gierki (i np. Firefoxa) wyskakuje dwa razy "OK!", dla niektórych pozostałych - tylko raz (?!)
Poszperałem w necie i podobno lepiej używać nowszej funkcji SendInput. Miałem problem z tym, że gdy wysłałem klawisz do gry, to "pamperek" :) przez cały czas przesuwał się w np. lewo:
wsprintf(tab,"%c",wParam); INPUT Klawisz; ZeroMemory (&Klawisz, sizeof(INPUT)); Klawisz.type=INPUT_KEYBOARD; Klawisz.ki.wVk=tab[0]; SendInput(1,&Klawisz,sizeof(INPUT));
Więc zrobiłem tak :
if (HIBYTE(GetKeyState(tab[0])!=0)) //Klawisz.ki.dwFlags=0; - z tym też nie działa SendInput(1,&Klawisz,sizeof(INPUT)); if (HIBYTE(GetKeyState(tab[0])==0)) { Klawisz.ki.dwFlags=KEYEVENTF_KEYUP; SendInput(1,&Klawisz,sizeof(INPUT)); }
Oczywiście nie działa! :) Gdzie tu jest błąd?
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
http://forum.ks-eksp...showtopic=59582
Użytkownik Cyrkiel edytował ten post 17 grudzień 2005, 23:13
OK, thx, ale w założeniu mój program ma być zminimalizowany/w trayu i przesyłać te informacje do aktywnej aplikacji! Jak to zrobić?
Znajdujesz uchwyt okna gry. i wysyłasz do niego:
np:
sendmessage(uchwyt,WM_KEYDOWN,vk_left,0)
sendmessage(uchwyt,WM_KEYUP,vk_left,0)
itd.
odbierasz od gracza1 znaki, wysyłasz sendmessage do gry i to czy twój program będzie zminimalizowany, czy w tray nie ma znaczenia.
Użytkownik johans edytował ten post 18 grudzień 2005, 04:38
Cosik nie działa (poniżej fragment kodu z dll'a obsługującego hak na klawiaturę) :
char tab[256]; wsprintf(tab,"%c",wParam); HWND uchwyt; uchwyt=GetForegroundWindow(); switch (tab[0]) { case 'D': SendMessage(uchwyt,WM_KEYDOWN,VK_LEFT,0); SendMessage(uchwyt,WM_KEYUP,VK_LEFT,0); break; }
Podczas grania, gdy naciskam klawisz D gracz1 i gracz2 powinni równocześnie przesunąć się w lewo - a tak się nie dzieje :( Chyba, że czegoś tu nie rozumiem :)
Użytkownik Buffalo edytował ten post 18 grudzień 2005, 13:49
Cosik nie działa (poniżej fragment kodu z dll'a obsługującego hak na klawiaturę) :
char tab[256]; wsprintf(tab,"%c",wParam); HWND uchwyt; uchwyt=GetForegroundWindow(); switch (tab[0]) { case 'D': SendMessage(uchwyt,WM_KEYDOWN,VK_LEFT,0); SendMessage(uchwyt,WM_KEYUP,VK_LEFT,0); break; }
Podczas grania, gdy naciskam klawisz D gracz1 i gracz2 powinni równocześnie przesunąć się w lewo - a tak się nie dzieje :( Chyba, że czegoś tu nie rozumiem :)

W taki sposób ? :
HWND uchwyt1,uchwyt2; uchwyt1=GetForegroundWindow(); switch (tab[0]) { case 'D': uchwyt2=GetForegroundWindow(); if (uchwyt1==uchwyt2) ShowMessage("OK!"); else ShowMessage("Dupa!"); SendMessage(uchwyt2,WM_KEYDOWN,VK_LEFT,0); SendMessage(uchwyt2,WM_KEYUP,VK_LEFT,0); break;
Inną sprawą jest to, że dla tej gierki (i np. Firefoxa) wyskakuje dwa razy "OK!", dla niektórych pozostałych - tylko raz (?!)
// EDIT :
Zamiast SendMessage dałem
keybd_event(VK_LEFT, MapVirtualKey(VK_LEFT,0), 0, 0); keybd_event(VK_LEFT, MapVirtualKey(VK_LEFT,0), KEYEVENTF_KEYUP, 0);
i działa, ale nie w gierce! :( Może ona nie pobiera klawiszy wprost z kolejki komunikatów, tylko jakoś inaczej....(???)
PS. Dlaczego, to SendMessage nie działa....?
// EDIT2:
Coś zaczęło działać (ale nie do końca poprawnie:) Jak się poddam, to napiszę :)
Użytkownik Buffalo edytował ten post 18 grudzień 2005, 15:43
Inną sprawą jest to, że dla tej gierki (i np. Firefoxa) wyskakuje dwa razy "OK!", dla niektórych pozostałych - tylko raz (?!)

Poszperałem w necie i podobno lepiej używać nowszej funkcji SendInput. Miałem problem z tym, że gdy wysłałem klawisz do gry, to "pamperek" :) przez cały czas przesuwał się w np. lewo:
wsprintf(tab,"%c",wParam); INPUT Klawisz; ZeroMemory (&Klawisz, sizeof(INPUT)); Klawisz.type=INPUT_KEYBOARD; Klawisz.ki.wVk=tab[0]; SendInput(1,&Klawisz,sizeof(INPUT));
Więc zrobiłem tak :
if (HIBYTE(GetKeyState(tab[0])!=0)) //Klawisz.ki.dwFlags=0; - z tym też nie działa SendInput(1,&Klawisz,sizeof(INPUT)); if (HIBYTE(GetKeyState(tab[0])==0)) { Klawisz.ki.dwFlags=KEYEVENTF_KEYUP; SendInput(1,&Klawisz,sizeof(INPUT)); }
Oczywiście nie działa! :) Gdzie tu jest błąd?