Taste an Spiel senden



  • 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.html

    was 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...



  • @Grabgewalt:

    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;
    }
    


  • Damit ich mich ja gerade mit einem ähnlichem Problem konfrontiert sehe.

    Soweit ich weiß - und hier gerade auch gelesen habe - unterbindet DirectInput die Annahme von WindowsMessages. Als Lösung wurde ein Hook vorgeschlagen.



  • Vielleicht funktioniert ja bloss das mit GetPixel nicht so wie du meinst.
    Hast du schon probiert einfach immer, sagen wir in Abständen von 1-2 Sekunden, einen Tastendruck zu senden? Also so ala

    while (1)
    {
        Sleep(1000);
        SendKeyDown();
        Sleep(1000);
        SendKeyUp();
    }
    


  • also daran liegts nich, wie gesagt, wenn ich in notepad bin oder so wo der benötigte pixelwert ja nich da is drückt er die 5.



  • Lies dir das mal durch. Da solltest Du sehen wo dein Problem liegt.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-48506-and-highlight-is-direct3d.html



  • Ja, also ich habs immernoch nich hingekriegt... Hooks sind doch eigentlich eher zum abfangen von Tasten oder?
    Es muss doch irgend jemand ne Lösung wissen?!



  • 👍



  • hat niemand eine lösung, würde mich nämlich auch interessieren, hab genau daselbe problem...

    wenn ich jedoch einen Mausklick simuliere (mit SendInput) klappt das ohne probleme...


Anmelden zum Antworten