Tasteneingabe an Spiel senden
-
Es ist ganz einfach: Wenn Du eine Taste drückst, musst Du sie auch wieder loslassen.... es braucht also immer min. 2 (in Worten: ZWEI) Events um einen Tastendruck zu simulieren...
-
Also müsste es so aussehen ?
#include <windows> #include <iostream> using namespace std; int main(int argc, char* argv[]) { bool terminate = false; COLORREF ref; Sleep(3000); UINT key; HWND hwnd; HWND foc; DWORD getThreadID; DWORD getThreadProcessID; bool Attach; hwnd = FindWindow (0,"Guild Wars"); if ( hwnd == 0 ) { cout<<"FindWindow error code:"<<GetLastError(); } HDC hdc = GetDC(0); getThreadID = GetCurrentThreadId(); getThreadProcessID = GetWindowThreadProcessId(hwnd,0); Attach = AttachThreadInput( getThreadID , getThreadProcessID , true ); if ( Attach == 0) { cout<<"AttachThreadInput error code: "<<GetLastError()<<endl; system("PAUSE"); } while ( terminate == false) { ref = GetPixel( hdc, 424, 93 ); if (ref == 0xDAE7A1) { key = MapVirtualKey( 0x31,0 ); INPUT data; data.type = INPUT_KEYBOARD; data.ki.wVk = 0x31; data.ki.wScan = key; data.ki.dwFlags = 0; data.ki.time =0; data.ki.dwExtraInfo = 0; SendInput (1 , &data, sizeof(data)); // Taste drücken SendInput (1 , &data, sizeof(data)); // Taste loslassen } if (GetAsyncKeyState(VK_ESCAPE) ==-32767) { AttachThreadInput( getThreadID , getThreadProcessID , false ); terminate = true; } } return 0; }
-
WO lässt Du denn da die Taste los?
Hast Du schon mal einen Blick ind ie Doku geworfen und die Millionen Beispiele im Internet angeschaut?
-
Jochen Kalmbach schrieb:
...und die Millionen Beispiele im Internet angeschaut?
Gut, ich muss mich korrigieren, Google kennt nur 313000 Treffer für SendInput...
-
Kleiner Tipp: Stichwort KEYEVENTF_KEYUP
HTH,
Martin
-
Hier sind wir im Forum WinApi unterwegs. Da gibt es noch die Möglichkeit, alle Maus- und Tastatureingaben vor der vorgesehenen Verarbeitung mit Subclassing selbst umzubiegen und anderes zu veranlassen.
-
Hallo berniebutt,
so wie es der Fragesteller formuliert hat, wird es mit dem Subclassing kaum funktionieren. Da er die Tasten an einen anderen Prozeß senden muß.db* schrieb:
Hallo ich versuche gerade eine Tasteneingabe an ein Spiel zu senden jedoch funktioniert es einfach nicht.
Oder hast Du in Verbindung mit DLL-Injektion gemeint?
Ok, da muß ich passen, mit DLL-Injektion kenne ich mich nicht so gut aus.HTH,
Martin
-
berniebutt schrieb:
Hier sind wir im Forum WinApi unterwegs. Da gibt es noch die Möglichkeit, alle Maus- und Tastatureingaben vor der vorgesehenen Verarbeitung mit Subclassing selbst umzubiegen und anderes zu veranlassen.
Bringt nur was, wenn das Zielprogramm auch WM_KEYDOWN&Partner verwendet.
-
injektion->Adminrecht schrieb:
berniebutt schrieb:
Hier sind wir im Forum WinApi unterwegs. Da gibt es noch die Möglichkeit, alle Maus- und Tastatureingaben vor der vorgesehenen Verarbeitung mit Subclassing selbst umzubiegen und anderes zu veranlassen.
Bringt nur was, wenn das Zielprogramm auch WM_KEYDOWN&Partner verwendet.
Bitt laß diesen Unfug mit WM_KEYDOWN & Co zu senden!
Siehe auch "Die Unsitte Tastatureingaben mit WM_KEYDOWN Nachrichten zu simulieren" (Link habe ich bereits weiter oben angegeben)Martin
-
Mmacher schrieb:
Bitt laß diesen Unfug mit WM_KEYDOWN & Co zu senden!
ich habe nie Vorgeschlgen mit subclassing zu arbeiten
-
Hallo, ich hab irgendwann damit aufgeben mit dem Tastendruch an Guild Wars senden.
Jetzt wollte ich es aber nochmal wissen, also hab ich AutoIT wieder installiert und geschrieben:AutoIT Code
Sleep(2000) Send("1")
Dann das Programm compiliert und den OllyDebugger ausgepackt. ( Das hätte ich mal ehr machen sollen ... )
Und das Geheimnis der ganzen Sache ist der Scancode.
Und so funktioniert es perfekt:
Ohne AttachThreadInput und so späße.#include <windows> #include <iostream> using namespace std; int main(int argc, char* argv[]) { Sleep(2000); INPUT data; data.type = INPUT_KEYBOARD; data.ki.wVk = 0x31; data.ki.wScan = 2; // scan code für taste 1 data.ki.dwFlags = 0; data.ki.time =0; data.ki.dwExtraInfo = 0; SendInput (1 , &data, sizeof(data)); // taste drücken data.ki.dwFlags = KEYEVENTF_KEYUP; SendInput (1 , &data, sizeof(data)); // taste loslassen return 0; } //---------------------------------------------------------------------------
-
Btw. AutoIT verwendet die Funktion: keybd_event Die sollten vielleicht auch mal ein Update machen.^^