SendMessage()



  • hallihallo,

    kann ich mit SendMessage() einen Tastendruck simulieren?
    und zwar im FEnster hwnd?

    SendMessage(hWnd, WM_KEYDOWN, VK_MENU, 0xb8);
     SendMessage(hWnd, WM_KEYUP, VK_MENU, 0xb8);
    

    weil das klappt irgendwie nicht, folgende Fehlermeldung:

    .../CodeBlocks/include/winuser.h:3514: error: too few arguments to function `HWND__* GetParent(HWND__*)'
    main.cpp:68: error: at this point in file
    main.cpp:68: error: 'struct HWND__' has no member named 'SendMessageA'



  • Probier's mal so zu machen:

    SendMessage(hWnd, WM_KEYDOWN, (WPARAM)(LPCTSTR)VK_MENU, (LPARAM)(LPCTSTR)0xb8);
    

    Kannst dir ja mal das hier ansehen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-165868.html



  • dankeschön für die schnelle Antwort,

    es kommt zwar keine Fehlermeldung, aber funktionieren scheint es auch nicht.
    Was mach ich falsch?

    SendMessage(hWnd, WM_KEYDOWN, (WPARAM)(LPCTSTR)VK_MENU, (LPARAM)(LPCTSTR)0xb8);
    	    SendMessage(hWnd, WM_KEYDOWN, (WPARAM)(LPCTSTR)VkKeyScan('I'), (LPARAM)(LPCTSTR)0x97);
    	   SendMessage(hWnd, WM_KEYUP, (WPARAM)(LPCTSTR)VK_MENU, (LPARAM)(LPCTSTR)0xb8);
    	    SendMessage(hWnd, WM_KEYUP, (WPARAM)(LPCTSTR)VkKeyScan('I'), (LPARAM)(LPCTSTR)0x97);
    


  • supersass1 schrieb:

    .../CodeBlocks/include/winuser.h:3514: error: too few arguments to function `HWND__* GetParent(HWND__*)'
    main.cpp:68: error: at this point in file
    main.cpp:68: error: 'struct HWND__' has no member named 'SendMessageA'

    Ich glaub, das spricht für sich. Was hast du genau in Zeile 68 stehen?



  • nein jetzt hab ich keine Fehlermeldung mehr...



  • 😕



  • supersass1 schrieb:

    dankeschön für die schnelle Antwort,

    es kommt zwar keine Fehlermeldung, aber funktionieren scheint es auch nicht.
    Was mach ich falsch?

    SendMessage(hWnd, WM_KEYDOWN, (WPARAM)(LPCTSTR)VK_MENU, (LPARAM)(LPCTSTR)0xb8);
    	    SendMessage(hWnd, WM_KEYDOWN, (WPARAM)(LPCTSTR)VkKeyScan('I'), (LPARAM)(LPCTSTR)0x97);
    	   SendMessage(hWnd, WM_KEYUP, (WPARAM)(LPCTSTR)VK_MENU, (LPARAM)(LPCTSTR)0xb8);
    	    SendMessage(hWnd, WM_KEYUP, (WPARAM)(LPCTSTR)VkKeyScan('I'), (LPARAM)(LPCTSTR)0x97);
    

    also es passiert einfach nichts.



  • Woher oder wie kriegst du denn das Handle(hWnd)?
    Oder was für ein Programm willst du denn schreiben?



  • mit dieser Funktion bekommen ich hWnd:

    HWND hWnd;
    
    int findwindow()
    {
        HWND hWnd;
    HANDLE hproc;
    DWORD procid;
    DWORD rw = 0;
    
    unsigned adress = 0x001504BC;  //0x11A9FBE7;
    char buffer[512];
    
    hWnd = FindWindow(0,"Warcraft III");
    if(!hWnd) {
    cout << "Fenster nicht Gefunden!" << endl;
    } else {
    cout << "Fenster Gefunden!" << endl;
    }
    
    ShowWindow(hWnd, SW_MAXIMIZE);
    }
    

    ich möchte lediglich mit SendMessage einen Tastendruck simulieren.
    Ich will damit erreichen, dass man ohne das Fenster, in diesem Fall Warcraft III, einen Tastendruck simulieren kann, quasi im Hintergrund...



  • Wahrscheinlich arbeitet dein Spiel nicht mit Messages(ist für Spiele zu langsam). Mit anderen Funktionen wird die gedrücke Taste aus dem Puffer gelesen und ich glaube nicht, dass SendMessage an diesem Puffer, was ändert.

    Informier probier's mal mit dieser Funktion:

    keybd_event(VirtualKeyCode, 0, 0L, 0L);
    keybd_event(VirtualKeyCode, 0, KEYEVENTF_KEYUP, 0L);
    

    MfG

    GNUnix



  • ja damit funktioniert es, aber damit muss das Fenster auch im Vordergrund sein, sprich markiert sein. Und das wollte ich ja gerade vermeiden.



  • Wird bei SetFocus, das Fenster auch nach vorne versetzt? Das weiß ich nicht genau!
    Kannst dich ja mal darüber in Google informieren, denn mit SendMessage wird's nich klappen, da es ein Spiel ist.

    MfG

    GNUnix



  • nein, das Fenster wird nicht nach vorne versetzt.

    Aber es funktioniert aber auch nicht so wie ich es mir vorstelle.

    also hWnd ist richtig deklariert, der Code:

    SetFocus(hWnd);
          keybd_event(VK_MENU,0xb8,0 , 0); // Alt Press
          keybd_event(VkKeyScan('I'),0x97,0 , 0); // ‘I’ Press
          keybd_event(VkKeyScan('I'),0x97, KEYEVENTF_KEYUP,0); // ‘i’ Release
          keybd_event(VK_MENU,0xb8,KEYEVENTF_KEYUP,0); // Alt Release
    

    Es geschieht leider irgendwie gar nichts.
    Woher weiß der Compiler denn, dass sich das SetFocus auf alle keybd_event()s bezieht?!



  • Das interessiert den Compiler nicht. Es wird mit dieser Funktion der Fokus(im Betriebssystem, also Windows) auf dieses Fenster gesetzt und keybd_event simuliert schickt den Tastendruck an das fokusierte Fenster.

    Probier es mal so:

    keybd_event(VK_MENU, 0, 0, 0);
    keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
    

    MfG

    GNUnix



  • ja das bringt ja nichts, ich bruach die Kombination mit ALT + I sonst seh ich das ja nicht, ob er das wirklich simuliert hat.



  • Setz mal zwischen dem Tastendruck und das Lösen eine kurze Warteroutine(sleep oder so) ein. Vielleicht muss das Spiel den Tastendruck erst registrieren.

    Oder so mit SendInput():

    INPUT ipSignal;
        ipSignal.type           = INPUT_KEYBOARD;
        ipSignal.ki.wVk         = byVirtualKeyCode;
        ipSignal.ki.wScan       = 0;
        ipSignal.ki.dwFlags     = 0L;
        ipSignal.ki.time        = 0L;
        ipSignal.ki.dwExtraInfo = 0L;
        SendInput(1, &ipSignal, sizeof(ipSignal));
    
        ipSignal.ki.dwFlags     = KEYEVENTF_KEYUP;
        SendInput(1, &ipSignal, sizeof(ipSignal));
    

    MfG

    GNUnix



  • Woher weiß der Compiler denn, dass sich das SetFocus auf alle keybd_event()s bezieht?!

    Gar nicht, da hier wirklich ein Tastendruck simuliert wird. Also nicht bloß einem Fenster es mitgeteilt sondern allen laufenden Programmen.



  • Ben04 schrieb:

    Woher weiß der Compiler denn, dass sich das SetFocus auf alle keybd_event()s bezieht?!

    Gar nicht, da hier wirklich ein Tastendruck simuliert wird. Also nicht bloß einem Fenster es mitgeteilt sondern allen laufenden Programmen.

    und was bringt dann SetFocus() ?
    Sprich, SetFcous bringt in Kombination mit keybd_event nichts, mit SendInput jedoch doch?!



  • Der Fokus ist im Betriebssystem Windows verankert, durch SetFocus wird diese Variable, Pointer oder was auch immmer auf das neue Fenster gesetzt. keybd_event sendet alle Keyboard-Events an das fokusierte Fenster. Also das hat nix mit dem Compiler zu tun, sondern mit dem Betriebssystem.

    MfG

    GNUnix



  • Ben04 schrieb:

    Gar nicht, da hier wirklich ein Tastendruck simuliert wird. Also nicht bloß einem Fenster es mitgeteilt sondern allen laufenden Programmen.

    ...keybd_event sendet alle Keyboard-Events an das fokusierte Fenster. Also das hat nix mit dem Compiler zu tun, sondern mit dem Betriebssystem.

    das widerspricht sich aber.


Anmelden zum Antworten