Taste an Spiel senden
-
Hallo, ich möchte an ein DirectX Spiel eine Taste senden. In Anwendungen wie Notepad klappt das ohne Probleme aber in dem Spiel kommt einfach nichts an. Habs schon mit sendinput, sendmessage,postmessage und keybd_event versucht aber nichts geht.
Hier mal die einzelnen Funktionen wie ich sie bisher probiert habe://///// INPUT InputData; int iEvents; InputData.type = INPUT_KEYBOARD; InputData.ki.wVk = 0x48; InputData.ki.wScan = 35; InputData.ki.dwFlags = 0; InputData.ki.time = time(NULL); InputData.ki.dwExtraInfo = 0; iEvents = SendInput(1, &InputData, sizeof(InputData)); ///// ///// SendMessage(hWnd, '5',0, 0); //// ///// keybd_event('5', 0, 0, 0); keybd_event('5', 0, KEYEVENTF_KEYUP, 0); //// //// PostMessage(hWnd, WM_CHAR, static_cast<WPARAM>('5'), 0L); ////Hat noch jemand ne Idee? Benutz ich die Funktionen falsch?
-
Hi, ne Lösung hab ich zwar nicht, aber ich glaub ich kann dir sagen warum:
Das Spiel benutzt wahrscheinlich Direct Input.
Wikipedia sagt:'Der Zugriff über DirectInput umgeht das Windows Message System (d. h. Ereignis-, Melde- und Warteschlangen) und erfolgt direkt auf die Hardware;'
Eine Idee hab ich leider nit.
-
Sowas, hab ich mir schon gedacht. Ich bin mir aber ziemlich sicher, dass sowas möglich sein sollte. Irgend jemand ne idee?
-
Wie waers mit nen Hook?
Gruß Tobi.
-
T0bi schrieb:
Wie waers mit nen Hook?
Gruß Tobi.
Und erläutere mal wie du dir das vorstellst in diesem Fall...

-
hmm kann man nicht die DirectInpute hooken?
-
So, hab mich ma registriert (bin der thread-ersteller).
also von hooks versteh ich gar nichts. kann mir da mal jemand das prinzip erklären?
-

-
schau mal ins FAQ, zweite seite, da muesste nen Beitrag von toom sein, da siehste das prinzip.
Wie das allerdings mit DirectInput gehen soll, keine Ahnung. Da wirst du wohl googlen müssen.
Gruß Tobi.
-
und ne andere möglichkeit fällt niemandem ein?
-

-
Ochherrjeh, das ging irgendwie, aber ich hab vergessen wie. Der Trick war auf jeden Fall die Felder unter InputData.ki richtig auszufüllen, bloss weiss ich nimmer wie genau, bzw. bin mir nichtmehr sicher.
Könnte sein dass man KEYEVENTF_SCANCODE setzen musste, und dann eben den Scancode in wScan reinschreiben. wVk sollte man dazu IIRC auf 0 setzen. Probier das mal.
-
hustbaer schrieb:
Ochherrjeh, das ging irgendwie, aber ich hab vergessen wie. Der Trick war auf jeden Fall die Felder unter InputData.ki richtig auszufüllen, bloss weiss ich nimmer wie genau, bzw. bin mir nichtmehr sicher.
Könnte sein dass man KEYEVENTF_SCANCODE setzen musste, und dann eben den Scancode in wScan reinschreiben. wVk sollte man dazu IIRC auf 0 setzen. Probier das mal.
kannst mir das nochma genau erklären? KEYEVENTF_SCANCODE setzen?
habs jetzt ma so gemacht, aber auch das funktioniert nicht. in andern anwendungen wie z.b. word oder so funktioniert das, nur in dem spiel tut sich einfach nichts,
INPUT InputData; int iEvents; InputData.type = INPUT_KEYBOARD; InputData.ki.wVk = 0; InputData.ki.wScan = 35; InputData.ki.dwFlags = KEYEVENTF_SCANCODE; InputData.ki.time = time(NULL); InputData.ki.dwExtraInfo = 0; iEvents = SendInput(1, &InputData, sizeof(InputData));
-
Grabgewalt schrieb:
hustbaer schrieb:
Ochherrjeh, das ging irgendwie, aber ich hab vergessen wie. Der Trick war auf jeden Fall die Felder unter InputData.ki richtig auszufüllen, bloss weiss ich nimmer wie genau, bzw. bin mir nichtmehr sicher.
Könnte sein dass man KEYEVENTF_SCANCODE setzen musste, und dann eben den Scancode in wScan reinschreiben. wVk sollte man dazu IIRC auf 0 setzen. Probier das mal.
kannst mir das nochma genau erklären? KEYEVENTF_SCANCODE setzen?
habs jetzt ma so gemacht, aber auch das funktioniert nicht. in andern anwendungen wie z.b. word oder so funktioniert das, nur in dem spiel tut sich einfach nichts,
INPUT InputData; int iEvents; InputData.type = INPUT_KEYBOARD; InputData.ki.wVk = 0; InputData.ki.wScan = 35; InputData.ki.dwFlags = KEYEVENTF_SCANCODE; InputData.ki.time = time(NULL); InputData.ki.dwExtraInfo = 0; iEvents = SendInput(1, &InputData, sizeof(InputData));Fast...:
INPUT InputData; int iEvents; // key-down InputData.type = INPUT_KEYBOARD; InputData.ki.wVk = 0; InputData.ki.wScan = 35; InputData.ki.dwFlags = KEYEVENTF_SCANCODE; InputData.ki.time = 0; InputData.ki.dwExtraInfo = 0; iEvents = SendInput(1, &InputData, sizeof(InputData)); Sleep(100); // key-up InputData.type = INPUT_KEYBOARD; InputData.ki.wVk = 0; InputData.ki.wScan = 35; InputData.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; InputData.ki.time = 0; InputData.ki.dwExtraInfo = 0; iEvents = SendInput(1, &InputData, sizeof(InputData));
-
klappt leider auch nicht

-
Ich hab es mit einem SDL Spiel probiert (verwendet das DirectX?) und das simmulieren von einem Tastendruck (bzw. mehreren) funktioniert recht gut:
in diesem Thread sieht man Auszüge aus dem Code meines Programms:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-204348.htmlwas aber bei mir noch nicht ganz funktioniert (weswegen ich den Thread auch erstellt hab) ist das richtige zeitliche Abstimmen der Ereignisse - so verhält sich das Spiel bei jedem Ablauf ein und derselben Steuerdatei jedes mal ein wenig anders

-
also auch mit nem hook gemacht letztlich. das muss doch auch irgendwie einfacher gehn.... ich will nich einfach nur was kopiern, will das was ich benutz auch verstehen und hooks sind schon was für sich find ich.
-
nein, du verstehst es falsch - der hook code ist dort nur zum aufnehmen...
der für dich wesentliche teil ist das hier:
inline INPUT KeyDown(WORD vk, WORD sc, HWND hwnd) { INPUT ipSignal; ipSignal.type = INPUT_KEYBOARD; ipSignal.ki.wVk = vk; ipSignal.ki.wScan = sc; ipSignal.ki.dwFlags = 0L; ipSignal.ki.time = 0L; ipSignal.ki.dwExtraInfo = (ULONG_PTR)hwnd; //ipSignal.ki.dwExtraInfo = 0; //Fenster mit dem Fokus SendInput(1, &ipSignal, sizeof(ipSignal)); return ipSignal; } inline INPUT KeyUp(INPUT ip) { ip.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, &ip, sizeof(ip)); return ip; }wobei dass mit ipSignal.ki.dwExtraInfo = (ULONG_PTR)hwnd; irgendwie nicht so ganz wie gewünscht funktioniert - Nachrichten werden immer nur an das Fenster mit dem Fokus geschickt...
-
http://wwwx.cs.unc.edu/~gb/wp/blog/2007/11/16/sending-key-events-to-pygame-programs/
Der macht im Prinzip nix anders.
Keine Ahnung warum das bei dir dann nicht will.
-
ich verstehs auch nich
er hats im grunde auch nich anders als ich...hier mal mein bisheriger code (gekürzt):
#define _WIN32_WINNT 0x0500 #include <cstdlib> #include <iostream> #include <windows.h> #include <fstream> #include <string> #define getPixelColor(x,y) GetPixel(GetDC(0),(x),(y)) #include <time.h> #if(_WIN32_WINNT >= 0x0500) #define KEYEVENTF_UNICODE 0x0004 /*Hier muss ich wohl noch was ändern?! Ich will die Taste 5 drücken*/ #define KEYEVENTF_SCANCODE 0x0008 #endif /* _WIN32_WINNT >= 0x0500 */ using namespace std; COLORREF pixel; int main() { HWND hWnd; hWnd = FindWindow(0,"KalOnline"); HDC hdc; hdc=GetDC(NULL); SetFocus(hWnd); SetForegroundWindow(hWnd); while(true) { RECT rcWindow; GetWindowRect(hWnd, &rcWindow); Sleep(50); pixel = GetPixel(hdc,rcWindow.left+120,rcWindow.top+38); /*Nimmt den Pixelwert an einer bestimmten Stelle des Spiels, durch die GetWindowRect funktion wird bei jeder Auflösung die richtige Position genommen*/ if (pixel != 2232746) { INPUT InputData; int iEvents; // key-down InputData.type = INPUT_KEYBOARD; InputData.ki.wVk = 0; InputData.ki.wScan = 06; InputData.ki.dwFlags = KEYEVENTF_SCANCODE; InputData.ki.time = 0; InputData.ki.dwExtraInfo = 0; iEvents = SendInput(1, &InputData, sizeof(InputData)); Sleep(100); // key-up InputData.type = INPUT_KEYBOARD; InputData.ki.wVk = 0; InputData.ki.wScan = 06; InputData.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; InputData.ki.time = 0; InputData.ki.dwExtraInfo = 0; iEvents = SendInput(1, &InputData, sizeof(InputData)); } } return 0; }