Taste an Spiel senden



  • 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