Anwendungen fernsteuern??



  • Hi, Leute!
    Bevor ihr mir jetzt sagt, ich soll in der Suche schauen, dann kann ich nur sagen: Hat mir auch geholfen. Aber irgendwie komme ich mit den Tipps dort nur ein kleines bisschen weiter. Ich will nämlich irgendeine Anwendungen fernsteuern, also z.B. Notepad, und es sollen nur Tastaturbefehle gesendet werden. Wenn ich den Notepad starte, will ich also z.B. Text in das Editfeld schreiben. Mit dem EnumChildWindows() verstehe ich das irgendwie nicht, kann ich nicht einfach an das Fenster mit dem aktuellen Focus dieser Anwendung entwas schicken?
    Was z.B. auch möglich sein soll ist, das ich in einer anderen Anwendung, die z.B. ein Textfeld und einen Button hat, erstmal Text in das Textfeld schreibe, dann ein Tab schicke, das der Focus auf den Button übergeht, und dann eine Eingabe simuliere, damit das Fenster bestätigt wird.

    Was ich im Prinzip suche ist eine Funktion, der ich sage: Hier hast du das Handle des Fensters (wohlgemerkt: Parentfenster), sende mir die Tastenanschläge "Blablabla" oder "STRG+C" oder "Tab" an das Fenster. Könnt ihr mir da helfen??

    Danke & Gruss,
    ~cp code_pilot



  • SendInput



  • hmmm jo danke hab ich mal ausprobiert...wie aber bekomme ich das Fenster in den Vordergrund? mein Testcode:

    void pressKey(int vKey)
    {
        KEYBDINPUT ki={0};
        ki.wVk = vKey;
        ki.wScan = MapVirtualKeyEx(vKey, 0, GetKeyboardLayout(0));
        ki.time = 10;
    
        INPUT ipEvent;
        ipEvent.type = INPUT_KEYBOARD;
        ipEvent.ki = ki;
    
        SendInput(1,&ipEvent,sizeof(INPUT));
    }
    

    und wenn ichs aufrufen will:

    HWND notepad = FindWindow (NULL, "Unbenannt - Editor");
            if(notepad == NULL)
            {
                    MessageBox(NULL, ":(", "", 0);
            }
            else
            {
                    MessageBox(NULL, ":) alles ok", "", 0);
            }
    
            //SetFocus(notepad);
            ShowWindow(notepad, SW_SHOWNORMAL);
            pressKey(VK_RETURN);
    

    Aber das Fenster kommt nicht in den Vordergrund 😡

    Gruss,
    ~cp code_pilot



  • HGmm und nochwas, ich habe mir mal die keybd_event()-Funktion angeschaut. Er soll jetzt mal was in ein Editfeld im eingenen Fenster schreiben. Bei dem Code

    SetFocus(hwnd_Edit);
            keybd_event( VK_SHIFT, 0, 0, 0);
            keybd_event( 'H', 0, 0, 0);
            keybd_event( 'H', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( 'A', 0, 0, 0);
            keybd_event( 'A', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( 'L', 0, 0, 0);
            keybd_event( 'L', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( 'L', 0, 0, 0);
            keybd_event( 'L', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( 'O', 0, 0, 0);
            keybd_event( 'O', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
    

    Das geht auch, aber wie kann ich jetzt den Notepad in den Vordergrund holen??

    Grüsse & Danke
    ~cp code_pilot



  • Ich denke mal, du musst zuerst noch ein Druck auf die Umschalttaste simulieren und dann nicht vergessen die ganzen Tasten auch wieder zu löschen (KEYEVENTF_KEYUP im 3. Parameter setzen) 🙄



  • Hey cool ich habs hingekriegt:

    HWND notepad = FindWindow (NULL, "Unbenannt - Editor");
            SetForegroundWindow(notepad);
            ShowWindow(notepad, SW_SHOWNORMAL);
            //SetWindowPos(notepad, HWND_TOP, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
            //pressKey(41);
            keybd_event( VK_SHIFT, 0, 0, 0);
            keybd_event( 'H', 0, 0, 0);
            keybd_event( 'H', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( 'A', 0, 0, 0);
            keybd_event( 'A', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( 'L', 0, 0, 0);
            keybd_event( 'L', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( 'L', 0, 0, 0);
            keybd_event( 'L', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( 'O', 0, 0, 0);
            keybd_event( 'O', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
    

    Sogar wenn die Anwendung minimiert ist funktioniert's 🙂 😋

    bye,
    ~cp code_pilot



  • code_pilot schrieb:

    Hey cool ich habs hingekriegt:

    HWND notepad = FindWindow (NULL, "Unbenannt - Editor");
            SetForegroundWindow(notepad);
            ShowWindow(notepad, SW_SHOWNORMAL);
            //SetWindowPos(notepad, HWND_TOP, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
            //pressKey(41);
            keybd_event( VK_SHIFT, 0, 0, 0);
            keybd_event( 'H', 0, 0, 0);
            keybd_event( 'H', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( 'A', 0, 0, 0);
            keybd_event( 'A', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( 'L', 0, 0, 0);
            keybd_event( 'L', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( 'L', 0, 0, 0);
            keybd_event( 'L', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( 'O', 0, 0, 0);
            keybd_event( 'O', 0, KEYEVENTF_KEYUP, 0);
            keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
    

    Sogar wenn die Anwendung minimiert ist funktioniert's 🙂 😋

    bye,
    ~cp code_pilot

    Hab geholfen 😃



  • Toll Marco, toll!

    Also, nur zur Info: Der nette Herr heisst Marco W, ist 24 Jahre alt, kommt aus Dortmund und gibt mach hier immer voll ein' auf Anonym. Das macht dem richtig Spass ... stimmts Marco??

    Ach ja nochwas: Man soll keine Zitate machen, wenn man den gesamten Beitrag übernimmt *grummel* ... 😡

    ~cp



  • <font face=verdana size=20>LOL<font> <--- *g geht eh net, wär kewl 🙄



  • Hi!
    Ok, bei funzt jetzt alles soweit. Allerdings habe ich noch eine Frage: Wie sende ich einen Punkt (.)???? Weil ich finde da nirgends unter http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp einen Punkt, oder den Keycode dafür. Gibt es da eine Lösung???

    Gruss,
    ~cp code_pilot



  • Bei mir ist es VK_OEM_PERIOD.

    Es ist aber wohl besser, wenn du das zur Laufzeit mit VkKeyScanEx ermittelst.



  • Hallo, ich bins mal wieder 😉

    Ich habe noch ein Problem bzgl. der Fernsteuerung von Anwendungen. Und zwar folgendes: Wie kann ich die Buchstaben ? \ ~ # ' " % $ § ² ³ ! = ( { } ) senden, und dies in einem Programm das wirklich in jeder Sprache (also US Tastatur, deutsche Tastatur, spanische Tastatur, französische Tastatur usw., also Weltweit) funktioniert. Weil im deutschen muss man ja ALT GR und ß drücken, um ein "\" zu erhalten, im amerikanischem drückt man nur die (im deutschen) "-"-Taste, und erhält das Backslash, ohne ALT GR.
    Gibt es da irgendeine gute (und möglichst einfache) Möglichkeit, dies mit keybd_event() zu lösen?

    Danke & Gruss,
    ~cp code_pilot :p



  • Uuuppps!
    Ich mal wieder sehr schlau war, und haben geguckt in SUCHE 😉

    Hier die Lösung:

    short sVal = VkKeyScan(ch);
    bool shift;
    BYTE bKey=(BYTE)(sVal);
    sVal=(BYTE)(sVal>>8);
    
    if((sVal & 0x01) == 0x01) shift=TRUE;
    
    if(shift) keybd_event(VK_SHIFT,0,0,0);
    
    keybd_event(bKey,0,0,0);
    keybd_event(bKey,0,KEYEVENTF_KEYUP,0);
    
    if(shift) keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
    

    Und es gate 🙂 🙂 🙂

    ~cp



  • habe mir mal nen brute force geschrieben, der arbeitet so ähnlich - bezüglich des schreiben - wie du es haben willst.

    bei mir muss man das so machen:
    du drückst auf'n button, und hällst die maustaste gedrückt gehst über das eingabe feld und läst los.
    dann habe ich die koordinaten (getcursorpos()) und kann mit windowfrompoint() das HWND bekommen.
    dann schreibe ich einfach mit setwindowtext den text rein, den ich haben will.



  • anhang:

    ist bestimmt etwas eleganter und schicker als das mit dem keyup & keydown, sendmessage, bla, irgendwas. weil wenn du zuviel oder zu schnell schreibst ist der hook-speicher(oder wie das ding auch immer heißt voll) voll und dein rechner beept wie bekloppt.

    ps:
    tastendrücken geht am besten mit sendmessage und als msg bm_click
    Bsp: SendMessage (hwnd, BM_CLICK, 0, 0);



  • hi, ja danke aber ich will Programme fernsteuern, also auch Tastenkombinationen wie z.B. ALT + D usw. senden, um eine Menü zu öffnen. Da kann man nicht SetWindowText() machen 😉

    Gruss,
    ~cp code_pilot


Anmelden zum Antworten