Wie erhält man die Kontrolle über ein Programm?



  • Hi,

    wenn man eine Software schreiben möchte, mit der man andere Programme kontrollieren möchte bzw. Zugriff auf deren Funktion erhalten möchte, wie macht man dies vom Ansatz her?

    Ganz platt als Beispiel: Wenn ich einen Button definiere und nach dessen Klicken startet dann z.B. Paint automatisch und malt autark ein Trapez in grüner Schrift, speichert dieses Bild und beendet sich wieder.

    Wie würde man da vorgehen? Das ist nur exemplarisch, ich verfolge das auch gar nicht aus irgendeiner Motivation heraus, ich wüsste aber gerne, wie man das konzeptionell umsetzen würde?


  • Mod

    Du suchst nach "Programmname API" und lässt dich davon leiten.

    Wenn du nichts dazu findest (zu Paint wirst du nichts finden), dann ist es der Mühe nicht Wert. Für letzteres gäbe es zwar prinzipiell auch Lösungen (man muss halt die Eingabegeräte nachmachen) aber das ist super-frickelig. Der Grund dafür, wenn ein Programm keine API anbietet ist einer der folgenden:
    a) Es ist ein kleines Progrämmchen für den Endanwender, wo es sich nicht für lohnt. Paint fällt hier drunter.
    b) Die Software ist uralt.
    c) Die Software ist scheiße.
    Daher lohnt sich die Entwicklung von Frickellösungen in solchen Fällen nicht. Das wird höchstens in irgendwelchen Firmen gemacht, die vor 30 Jahren mal für viel Geld eine Software gekauft haben; diese jetzt automatisch steuern möchten; deren jetziges Entwicklungsbudget dafür aber nur ein einziger, armer Entwickler ist.



  • Danke!

    Könnte es nicht schlicht auch d) es wird keine API angeboten sein?

    Oder haben alle "großen" Programme eine API (z.B. Adobe, Office, Steam, Skype etc..)?
    Ich kann natürlich auch googlen, ob ich jeweils etwas finde aber ich wunder mich, ob das quasi ein generelles Konzept ist, so etwas (für Software-Entwickler) anzubieten?



  • SeppJ hat nur Gründe dafür aufgeführt, warum es keine API für ein Programm gibt. Deine Option d) lässt sich auf zwei Fälle reduzieren:

    `

    a) es gibt eine API

    b) es gibt keine API

    `

    Selbst wenn es eine API für ein Programm gibt ist sie nicht genormt, d.h. jedes Programm benutzt seine eigene Art zur Fernsteuerung. Die zu Grunde liegende Technik kann aber genormt sein (TCP/IP, Pipes, COM, etc.).
    Bei allen "großen" Programmen hat man sich wahrscheinlich zu Beginn der Entwicklung schon für oder gegen eine Fernsteuerung entschieden, denn die Implementierung zieht einen großen Mehraufwand nach sich. Ein generelles Konzept gibt es nicht.



  • also du kannst grundsätzlich mit der windows-funktion PostMessage auf andere programme zugreifen und diese steuern.

    bezogen auf deine beispielfrage bedeutet dies:
    - kindprozess erstellen
    - WM_LBUTTONDOWN mit koordinaten der schaltfläche für den stift posten
    - WM_LBUTTONDOWN mit koordinaten der schaltfläche für die grüne farbe posten
    - WM_LBUTTONDOWN mit koordinaten der einzelnen punkte für die einzelnen linien posten

    wenn du jetzt deine eigenen programme erstellen willst, die sowas unterstützen, dann nimmst du dafür natürlich pipes, schreibst da auf der einen seite kommando x rein und führst auf der anderen seite die entsprechenden funktionen für kommando x aus.



  • Wade1234 schrieb:

    also du kannst grundsätzlich mit der windows-funktion PostMessage auf andere programme zugreifen und diese steuern.

    bezogen auf deine beispielfrage bedeutet dies:
    - kindprozess erstellen
    - WM_LBUTTONDOWN mit koordinaten der schaltfläche für den stift posten
    - WM_LBUTTONDOWN mit koordinaten der schaltfläche für die grüne farbe posten
    - WM_LBUTTONDOWN mit koordinaten der einzelnen punkte für die einzelnen linien posten

    wenn du jetzt deine eigenen programme erstellen willst, die sowas unterstützen, dann nimmst du dafür natürlich pipes, schreibst da auf der einen seite kommando x rein und führst auf der anderen seite die entsprechenden funktionen für kommando x aus.

    Vielen Dank!
    Zum Verständnis: Handelt es sich da um " https://msdn.microsoft.com/en-us/library/windows/desktop/ms644944(v=vs.85).aspx " ?

    Wie würde man das denn mit so einer pipe machen?
    Ich glaube, ich würde da doch gerne mal was zumindest Einfaches programmieren, um ein Gefühl dafür zu kriegen. Kann man bestimmt irgendwann in einem anderen Kontext mal gebrauchen.

    Mal angenommen, ich möchte das ganz simpel aber funktional halten (damit gleich ein paar mehr Sachen involviert werden, die mich parallel auch noch interessieren):
    Man öffnet den Browser, gelangt auf eine nur im LAN verfügbare Seite, hat dort die Möglichkeit nun zwischen "Male ein grünes Dreieck" und "Male ein blaues Rechteck" (impliziert, dass Paint sich selbst öffnet, das Bild speichert und selbst wieder schließt).

    Wie könnte ich das angehen, was muss ich mir angucken? Die etwaigen Programmierbefehle usw. würde ich mir dann vermutlich schon irgendwie raussuchen können aber was benötige ich überhaupt, womit fange ich an?



  • Wenn du einfach nur ein Programm fernsteuern möchtest (als ob ein Anwender die Aktionen durchführt), dann schau dir mal für Windows z.B. AutoIt oder AutoHotkey an.


  • Mod

    Wie gesagt, du willst auf keinen Fall ein Programm per simulierten Nutzereingaben fernsteuern! Bloß weil die Antwort ist "es geht", heißt das nicht, dass das eine gute Idee ist. Informatiker sagen eben ungerne Nein, deswegen antworten sie mit "Ja, es geht", selbst wenn es eine furchtbare Idee ist.

    Dass ein Programm keine API hat, hat schließlich die oben schon erläuterten Gründe. In keinem der erklärten Fälle gibt es einen trifftigen Grund, die massive nötige Arbeit darein zu stecken, diese per simulierten Eingaben zu bedienen. Nehmen wir beispielsweise dein Paint-Beispiel: Wieso sollte irgendjemand ein Bild automatisch mit Paint erstellen wollen? Paint ist ein bewusst simpel gehaltenes Endanwenderprogramm, mit dem Oma Erna mal eben fix ein Bildchen malen kann. Wieso sollte irgendein Programm die Aufgabe "Bildchen malen" mit Paint erledigen wollen, anstatt einfach selber direkt eine Bilddatei zu erstellen? Deswegen hat Paint auch keine API. Und deswegen wäre es auch absolute Zeitverschwendung, in wochenlanger Arbeit die Erstellung eines Bildes in Paint per Fernsteuerung zu programmieren, wenn man in wenigen Minuten die Erstellung des gleichen Bildes einfach so direkt programmieren könnte.



  • Progressive schrieb:

    Vielen Dank!
    Zum Verständnis: Handelt es sich da um " https://msdn.microsoft.com/en-us/library/windows/desktop/ms644944(v=vs.85).aspx " ?

    ja genau. aber das ganze ist ein riesiger rechenaufwand und mehr was für "notfälle".

    wenn du ein bild malen möchtest, kannst du das meine ich auch direkt über die winapi (und bestimmt auch mit direct2d und zig anderen) machen, indem du dir da im programmcode eine bitmap erstellst, die linien zeichnest und das ganze dann speicherst.

    Wie würde man das denn mit so einer pipe machen?
    Ich glaube, ich würde da doch gerne mal was zumindest Einfaches programmieren, um ein Gefühl dafür zu kriegen. Kann man bestimmt irgendwann in einem anderen Kontext mal gebrauchen.

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx
    vom prinzip her schreibst du da in den standard input des anderen programms irgendetwas hinein, das dieses dann einliest.

    Mal angenommen, ich möchte das ganz simpel aber funktional halten (damit gleich ein paar mehr Sachen involviert werden, die mich parallel auch noch interessieren):

    ich glaube, dass du das nicht so einfach "ganz simpel und funktional" halten kannst, ohne alles selbst von vorne zu programmieren. du kannst den alten mercedes von 1960 ja auch nicht mal eben so an den parallelport anschließen, weil er da nicht für gemacht ist, sondern du brauchst dann hydraulikpumpen und stempel, um die pedale zu betätigen usw.
    ähnlich verhält sich das mit postmessage auf paint.

    Man öffnet den Browser, gelangt auf eine nur im LAN verfügbare Seite, hat dort die Möglichkeit nun zwischen "Male ein grünes Dreieck" und "Male ein blaues Rechteck" (impliziert, dass Paint sich selbst öffnet, das Bild speichert und selbst wieder schließt).

    Wie könnte ich das angehen, was muss ich mir angucken? Die etwaigen Programmierbefehle usw. würde ich mir dann vermutlich schon irgendwie raussuchen können aber was benötige ich überhaupt, womit fange ich an?

    das kannst du bestimmt mit php oder so machen. aber warum willst du sowas überhaupt? also mir fallen jetzt nicht soviele gründe ein, warum ich auf eine internetseite gehen und auf einen knopf drücken sollte, damit sich dann auf dem server paint öffnet und ein bild gemalt wird.



  • Wade1234 schrieb:

    Wie würde man das denn mit so einer pipe machen?
    Ich glaube, ich würde da doch gerne mal was zumindest Einfaches programmieren, um ein Gefühl dafür zu kriegen. Kann man bestimmt irgendwann in einem anderen Kontext mal gebrauchen.

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx
    vom prinzip her schreibst du da in den standard input des anderen programms irgendetwas hinein, das dieses dann einliest.

    Wie finde ich den standard input eines Programms heraus?

    Wade1234 schrieb:

    das kannst du bestimmt mit php oder so machen. aber warum willst du sowas überhaupt? also mir fallen jetzt nicht soviele gründe ein, warum ich auf eine internetseite gehen und auf einen knopf drücken sollte, damit sich dann auf dem server paint öffnet und ein bild gemalt wird.

    Das ist natürlich schon eher unsinnig, hätte auch nur rein didaktischen Hintergrund. Vlt. fällt mir aber auch noch was Sinnvolles ein 🙂



  • Progressive schrieb:

    Wie finde ich den standard input eines Programms heraus?

    In dem Beispielprogramm unter dem Link wird alles gezeigt. Nachher rufst du nur noch ReadFile und WriteFile auf und schreibst das dann automatisch rein.

    Das ist natürlich schon eher unsinnig, hätte auch nur rein didaktischen Hintergrund. Vlt. fällt mir aber auch noch was Sinnvolles ein 🙂

    Achso. Also vom Prinzip her kannst du mit Pipes Daten an scanf übergeben und die Daten von printf abfangen und natürlich irgendwelche beliebigen Daten zwischen zwei Prozessen austauschen. Mit Sockets geht das auch und dann sogar über das Netzwerk.



  • Hier muss noch klargestellt werden, was Pipes eigentlich sind. Ich meinte in meinem Posting eigentlich die Windows Pipes, die mit Standard I/O nichts zu tun haben.

    1. Pipes per Standard I/O
      Verschiedene Programme werden kaskadiert aufgerufen und tauschen Daten über Standard I/O aus. Du hast zum Beispiel eine Textdatei mit einem englischen Text, den du auf deutsch übersetzen und dann ausdrucken möchtest. Dazu hast du drei Programme: less, en2de und print. less gibt den Inhalt einer Datei auf der Standardausgabe aus, en2de liest Daten aus der Standardeingabe, übersetzt sie und gibt sie auf der Standardausgabe auf deutsch wieder aus und print druckt das, was es über die Standardeingabe liest. Der Aufruf sähe dann so aus:

    less english.txt | en2de | print

    Die Pipe Symbole bewirken, dass das nachfolgende Programm die Ausgabe des vorhergehenden Programms als Eingabe benutzt. Die Eingabe von print ist also das, was en2de ausgibt. Und die Eingabe von en2de ist das, was less ausgibt.
    (Vermutung) Diese Art sind wohl in der *nix Welt weit verbreitet und unter Windows nicht so verbreitet.

    1. Windows Pipes
      Windows Pipes sind eine Art der Netzwerkkommunikation, ähnlich wie TCP/IP. Windows bietet eine API, mit der Pipes erzeugt und verbunden werden können, sowie die Möglichkeit Daten über Pipes zu empfangen oder zu schreiben. Pipes werden oft für Interprozesskommunikation (IPC) benutzt, da sie weniger Overhead als TCP/IP haben.

    Beide Pipe Typen sind für IPC geeignet, machen das aber über völlig unterschiedliche Techniken.



  • Unter linux geht das mit den pipes auch aus dem programm heraus, nur dass man das da mit pipe(), dup2(), fork() und exec() macht und nicht mit CreateProcess(). Ich muss das wissen, ich habe mich da über Wochen tage- und nächtelang mit abgeärgert. 😃



  • Progressive schrieb:

    Danke!

    Könnte es nicht schlicht auch d) es wird keine API angeboten sein?

    Oder haben alle "großen" Programme eine API (z.B. Adobe, Office, Steam, Skype etc..)?
    Ich kann natürlich auch googlen, ob ich jeweils etwas finde aber ich wunder mich, ob das quasi ein generelles Konzept ist, so etwas (für Software-Entwickler) anzubieten?

    Also Office hat mehrere APIs, Skype hat auch eine API. Zu Adobe und Steam kann ich nichts sagen. Bei Letzterem könnte ich mir vorstellen, dass man mit einer potentiellen API neue Spiele einstellen kann oder Updates einstellen kann. Fernsteuern im Sinne von "starte ein Spiel auf diesem Client" gibt es ziemlich sicher nicht weil es quasi keine Anwendungsgebiete dafür gibt.

    MfG SideWinder


Log in to reply