ďťż

Ł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
  •