GUI über Batch-Routine ansteuern
-
hallo SideWinder!
danke für Deine Antwort. Bei der GUI, wo ich das <Enter>-Drücken simulieren möchte, handelt es sich um einen Installationsdialog, um genau zu sein um die Auswahl des Installationsverzeichnisses. An den Quellcode komme ich wahrscheinlich nicht ran.

Ich habe das Problem, dass ich auf dem einem Intelligenten Gerät bei jedem Start immer wieder initial Installationen durchführen muss, da das BS und alle Anwendungen dort nur temporär im Speicher gehalten werden. Allerdings werden diese Installationen über eine GUI abgewickelt. Wenn ich den Vorgang automatisieren will, muss ich also diese GUIs (ENTER-Drücken genügt) irgendwie ansprechen. Oder ich muss die Installationen händisch vornehmen (heißt Dateien händisch an den Zielort kopieren und Registry-Einträge selbst setzen). Nachdem der 1. Weg (einfach) scheinbar nicht geht, werde ich mich am Zweiten (für mich sehr schwer) versuchen.

Nochmal Danke für Deine Antwort!
Ciao
shoatPS.
Eine andere Variante wäre, das Auswählen des Installationspfades abzuschalten, dann kommt auch die GUI nicht. aber ich habe keine Ahnung, wie das gehen soll. Kennt sich jemand mit CAB-Files aus?
-
Darfst du Programme in den Autostart der Maschine einfügen? Dann könntest du dir ein Windows-Programm schreiben, dass im Autostart aufgerufen wird und den Mausklick simuliert - das wär weniger ein Problem.
Allerdings müsstest du dafür Programmierkenntnisse haben - mit Batchbefehlen ist es höchstwahrscheinlich nicht möglich.
MfG SideWinder
-
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
shoatPS.
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 losgelassenhier 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 mehrich 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