GUI über Batch-Routine ansteuern



  • hallo SideWinder!

    ich kann über die start.bat so viele Programme und in beliebiger Reihenfolge starten. was meinst Du mit diesem Windowsprogramm, dass den Mausklick simuliert. wie würde sowas aussehen / funktionieren? Programmiergrundkenntnisse habe ich. hast Du einen Link und ein Quellcodefragment?

    Danke!

    Ciao
    shoat

    PS.
    Nicht vergessen, das Programm muss unter WIN CE .NET laufen!



  • Ich werde dich mal ins WinAPI-Forum verschieben, dort erklären sie dir wie du den Tastendruck simulieren kannst 🙂

    Alles weitere ist dann nur noch eine Kleinigkeit *g*

    MfG SideWinder



  • Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Schau dir mal SendInput an 🙂



  • hallo Leute,

    @SideWinder
    Danke, dass Du mir so gut geholfen hast! 🙂

    @flenders
    Auch Dir danke. Ich sehe ein, dass es mit dem SendInput sicher klappen müßte. Allerdings habe ich - ehrlich gesagt - auf die Schnelle keine Ahnung wo und wie ich die Funktion aufrufen bzw. verwenden kann. Ich habe noch nie WinAPI programmiert, deswegen weiß ich nicht mal, wie ich anfangen muss. 😞

    @all
    Hat jemand für mich einen Link zu einem guten Tutorial?
    (Ich suche auch gleich mal bei google...)

    Noch lieber wäre es mir ja, wenn mir jemand gleich den kompletten Quellcode für ein Programm, dass ein <ENTER> simuliert liefern könnte! Muss es ja geben und ich werde so schnell nicht in die Verlegenheit kommen, etwas ähnliches machen zu müssen. 😉

    Naja, aber ihr habt schon recht, ich muss auch ein wenig dazuhelfen, jetzt wo ihr mir schon auf den richtigen Weg gebracht habt! Ich mach mich jetzt mal auf die Suche nach einem Tutorial.

    Ciao
    shoat



  • probier mal:

    HWND hwnd = FindWindow(NULL,"Unbenannt - Editor"); //schaun wie das programm im titel heißt und hier eintragen, also dein GUI
    HWND SetActiveWindow(HWND hwnd);
    
    keybd_event(13, 0, 0, NULL); //13 ist dezimal von 0D hex zu finden beim link unten
    keybd_event(13, 0, KEYEVENTF_KEYUP, 0); //hier wird die taste wieder losgelassen
    

    hier der link: keybd_event liste

    @flenders
    das mit sendinput würd mich genauer interessieren, da ich auch nicht so recht damit umzugehen weiß und es (vielleicht) benötige [mit keybd_event funktionierts bei mir nicht]



  • keybd_event, mouse_event, etc. sind allesamt durch SendInput() ersetzt worden. Dessen gebrauch ist sehr einfach:

    INPUT in;
    in.type = INPUT_KEYBOARD;
    in.ki.wVk = VK_RETURN; /* Enter drücken */
    in.ki.wScan = 0; /* Hier den HW-ScanCode von Enter einfügen, kenn ich grade nicht */
    in.ki.dwFlags = 0; /* Erstmal ganz normal Taste drücken */
    in.ki.time = 0; /* Zeit, ein Faktor den bei Tastatureingaben sowieso nie jemand beachtet */
    in.ki.dwExtraInfo = 0; /* Auch hinlänglich */
    SendInput(1,&in,sizeof(in));
    
    in.ki.dwFlags = KEYEVENTF_KEYUP; /* Und wieder loslassen */
    SendInput(1,&in,sizeof(in));
    

    Damit nicht wir die Eingabe erhalten müssen wir natürlich wie vorher gezeigt das richtige Fenster suchen und mit SetForegroundWindow() in den Vordergrund bringen. SetActiveWindow() ist zu wenig!!

    MfG SideWinder



  • sidewinder was benötige ich noch alles für den code?
    denn so kommen ja einige fehler, wie zb undefined symbol 'input','hd','in','input_keyboard' und einige mehr

    ich schau natürlich in der msdn nach und versuch alles was ich mir denke, aber man sieht ich kenn mich leider sehr sehr wenig aus, bräuchts aber für ein verflixtes return das mit keybd_event nicht funktioniert 😞

    wenns geht jede kleinigkeit erklären, sonst bin ich hilflos (obwohl das mit keybd:event hab ich hinbekommen 😃 )
    danke!



  • hallo Leute,

    danke für Euere Hilfe! 🙂
    Es scheint mir so, als wäre mein Problem schon so gut wie gelöst - es scheitert nur noch an meiner eigenen Unzulänglichkeit. 😞

    wenn ich es richtig verstanden habe, dann muss ich also den folgenden Code verwenden:

    HWND hwnd = FindWindow(NULL,"Installing Microsoft SQL Client"); 
    // bzw.
    // HWND hwnd = FindWindow(NULL,"Installing Microsoft SQL CE 2.0"); 
    // ~ Name der Anwendung oben im Fenster?
    HWND SetForegroundWindow(HWND hwnd);
    
    INPUT in;
    in.type = INPUT_KEYBOARD;
    in.ki.wVk = VK_RETURN; /* Enter drücken */
    in.ki.wScan = 0; /* Hier den HW-ScanCode von Enter einfügen, kenn ich grade nicht */
    in.ki.dwFlags = 0; /* Erstmal ganz normal Taste drücken */
    in.ki.time = 0; /* Zeit, ein Faktor den bei Tastatureingaben sowieso nie jemand beachtet */
    in.ki.dwExtraInfo = 0; /* Auch hinlänglich */
    SendInput(1,&in,sizeof(in));
    
    in.ki.dwFlags = KEYEVENTF_KEYUP; /* Und wieder loslassen */
    SendInput(1,&in,sizeof(in));
    

    Soweit so gut. Zwei Fragen:
    1. Was ist ein HW-ScanCode? Aus den Sachen, die ich beu google finde, werde ich nicht wirklich schlau. 😞
    2. Was gehört um das obige Codefragmente rum, damit ich z. B. im VisualStudio 6.0 eine lauffähige Anwendung bekomme? Ich habe bisher nur Consolen-Anwendungen und keine Win32-Anwendungen programmiert und alle Tutorials, die ich bisher gefunden habe, zielten darauf ab ein eigenes Fenster zu programmieren. Aber ich will ja ein bestehendes Fenster ansprechen - dazu habe ich nichts gefunden. 😞

    Ich sehe es ja ein, wahrscheinlich stelle ich mich wirklich zu blöd an, aber ich weiß mir wirklich nicht zu helfen. Für viele von Euch, ist es bestimmt ein leichtes mit den zur verfügungstehenden Infos ein Programm zu schreiben, wie ich es brauche, aber ich bin schlichtweg überfordert! 😞

    Ich hoffe, ich falle Euch mit meiner Unzulänglichkeit nicht allzu sehr auf die Nerven!

    Danke, nochmals für Euere Hilfe.

    Ich stürze mich jetzt nochmal in Suchen bei google und versuche selber eine Lösung zu finden. Wäre trotzdem schön, wenn ich noch etwas von Euch hören würde!

    Viele Grüße!

    Ciao
    shoat



  • Für den HW-Scancode: Schau dir mal MapVirtualKey an

    zur Anwendung: einfach direkt in WinMain reinschreiben (theoretisch kannst du es auch aus einer Konsolenanwendung heraus machen) - WndProc brauchst du dann keine 😉



  • Wie gesagt du kannst WinAPI-Aufrufe auch ganz normal in Konsolenprogrammen verwenden.

    Hier mal ein kleines Schnipsel:

    #include <windows.h>
    
    int main ()
    {
        // Installationsfenster suchen
        HWND hwnd = FindWindow(0,"Installing Microsoft SQL Client"); 
    
        // Installationsfenster als derzeit aktives Fenster einsetzen (wichtig, damit UserInput an dieses Fenster geleitet wird
        SetForegroundWindow(hwnd);
    
        // Taste 'Enter' drücken und daraufhin wieder loslassen -> da ich nicht weiß ob die Anwendung auf WM_KEYDOWN oder WM_KEYUP reagiert
        INPUT in;
        in.type = INPUT_KEYBOARD;
        in.ki.wVk = VK_RETURN; /* Enter drücken */
        in.ki.wScan = MapVirtualKey(VK_RETURN,0); /* HW-Scan-Code */
        in.ki.dwFlags = 0; /* Erstmal ganz normal Taste drücken */
        in.ki.time = 0; /* Zeit, ein Faktor den bei Tastatureingaben sowieso nie jemand beachtet */
        in.ki.dwExtraInfo = 0; /* Auch hinlänglich */
        SendInput(1,&in,sizeof(in));
    
        in.ki.dwFlags = KEYEVENTF_KEYUP; /* Und wieder loslassen */
        SendInput(1,&in,sizeof(in));
    
        return(0);
    }
    

    Wichtig: Diese Anwendung darf erst ausgeführt werden, wenn die Install-Anwendung bereits vollständig gestartet wurde und ihr Fenster richtig anlegen konnte. Also in der AutoStart-Reihenfolge unbedingt _hinter_ das Installationsprogramm setzen!

    Bzw. wenn sie sicher startet kannst du ja auch eine Schleife um FindWindow() herumbauen.

    MfG SideWinder


Anmelden zum Antworten