Controlsend über Inputbox

  • Hallöchen.

    Ich möchte Controlsend benutzen, um Texte an beliebige Fenster senden zu können. Das Zielfenster soll dabei jeweils über die Inputbox gewählt werden.
    Ist es möglich, dies nur (und universal) über den Fenstertitel zu ermöglichen? Unversierte Anwender werden kaum wissen, wie sie an die Klasse, ID oder den handle eines Fensters kommen.

    Ansonsten müsste ich Presets erstellen für eine ganze Latte an Programmen, die man dann aus einer Dropdownbox wählen könnte. Und so wirklich universal wäre das dann auch nicht wirklich.

    LG :)

    PS: Die Option, dem erfahreneren User Inputboxen für Klasse und Handle etc zur Verfügung zu stellen, hätte ich natürlich trotzdem.

    PPS: Eigentlich ist der Threadtitel rückblickend etwas suboptimal gewählt, aber ich denke es ist klar, worauf ich hinaus will. :)

    3 Mal editiert, zuletzt von Klumpi (28. November 2010 um 11:47)

  • Controlsend ist mir bekannt.
    Nur gelang es mir nicht, z.B. das minimierte Notepad nur über den Fenstertitel anzusprechen. Es kam einfach nichts an. Also scheint der Fenstertitel alleine nicht zu genügen. Zumindest nicht für Notepad.

    LG

  • Also scheint der Fenstertitel alleine nicht zu genügen.


    Du brauchst zusätzlich noch die controlID!

    • Bei Notepad ist das "Edit1" oder 15
    • Bei SciTE ist das "Scintilla1" oder 350
    Zitat

    Ansonsten müsste ich Presets erstellen für eine ganze Latte an Programmen


    Ich glaub darauf läufts hinaus :(

  • Mh, ich habe es fast befürchtet.
    Wie könnte ich das denn sonst lösen? Wäre es zum Beispiel möglich, alle laufenden Prozesse aufzulisten, den User einen auswählen zu lassen, und mein Programm liest die relevanten Daten selber aus, um das Controlsend damit zu füttern?
    LG

  • dann doch besser

    [autoit]

    WinList()

    [/autoit]
  • Danke, das hilft weiter.

    Wenn ich jetzt noch an die Klassen von den Prozessen käme, müsste ich genug Daten haben, um Controlsend zu füttern. Ich habe dazu noch WinGetClassList gefunden. Das spuckt aber jede Menge Date/Klassen aus. Darf ich davon ausgehen, dass das erste Erebnis die Klasse ist, welche man auch im Controlsend benutzen würde?
    LG

  • Laut Hilfe schon.

    Code
    Gibt einen String mit den Klassennamen des Fensters zurück.
    Code
    Klassennamen werden durch einen Zeilenvorschub (linefeed = @LF) voneinander getrennt.
  • Mhh... im Moment funktioniert es so nicht.

    Also was ich vorhabe ist ja klar. Nehmen wir an, der Benutzer wählt über die Inputbox (per Fenstertitel) Notepad aus.

    [autoit]


    $liste=WinGetClassList("Unbenannt - Editor") ;Notepadklassen ermitteln
    $klasse=StringSplit($liste, @LF) ;Erste Klasse aus der Liste ermitteln
    MsgBox("","",$klasse[1]) ;Testausgabe der ermittelten Klasse
    ControlSend("Unbenannt","",$klasse[1],"test") ;funktioniert nicht - klasse="Edit"
    ControlSend("Unbenannt","","Edit1","test") ;funktioniert - klasse="Edit1"

    [/autoit]

    Das Problem ist schnell ersichtlich. WinGetClassList gibt nicht Edit1 als Klasse für Notepad aus. Liegt da jetzt der Fehler bei mir?
    Oder ist "1" die Instanz der Klasse "Edit"? Und wenn, ist da über eine Funktion ein rankommen?

    LG

    Edit: Ach ich bin doch doof, die ID ist einzigartig. Dann stellt sich die Frage nach der Klasse gar nicht mehr. Hat sich also bis auf weiteres erledigt :D

    Edit2: *seufz* Genau genommen ändert das auch nicht viel. Durch welche Funktionen bekommt denn Au3Info seine Daten zu Klassen und IDs?

    2 Mal editiert, zuletzt von Klumpi (27. November 2010 um 14:58)

    • Offizieller Beitrag

    WinGetClassList liefert dir nur eine Übersicht über die Klassen. Die Nummerierung mußt du schon selbst übernehmen.

    [autoit]

    $liste=WinGetClassList("Unbenannt - Editor") ;Notepadklassen ermitteln
    $klasse=StringSplit($liste, @LF) ;Erste Klasse aus der Liste ermitteln
    MsgBox("","",$klasse[1]) ;Testausgabe der ermittelten Klasse
    ControlSend("Unbenannt","",$klasse[1]&1,"test") ;Manuelle Nummerierung führt zum Erfolg.
    ControlSend("Unbenannt","","Edit1","test") ;funktioniert - klasse="Edit1"

    [/autoit]

    Edit: Du mußt schon selber wissen welche Instance einer Klasse du verwenden willst. Das wird dir kein Prog für dich übernehmen.

  • Nochmal im Klartext, was ich vorhabe.

    Mein Script sollen 2 Inputboxen enthalten.
    In die erste trägt man den Titel eines beliebigen Fensters ein. Bei Notepad z.B. "Unbenannt".
    Ich gehe davon aus, dass Handle/ID/Klassen der Fenster dem Anwender nicht bekannt sind.

    In die zweite Inputbox kommt der Text, welcher an das Fenster (in dem Falle Notepad) gesendet werden soll.

    Bei Notepad reicht aber nur der Fenstertitel nicht aus, um ControlSend zu benutzen, sondern es wird auch die Klasse "Edit1" gebraucht.
    Mein Script soll also die vom ControlSend benötigte Klasse des angesteuerten Fensters ermitteln.

    ControlSend(GuiCtrlRead($titel),"",$klasse,GuiCtrlRead($text))

    So in der Art habe ich mir das vorgestellt.

    • Offizieller Beitrag

    Du mußt schon selber entscheiden, auf welche Klasse Controlsend zugreift.
    Welcher Nutzen hätte es auch einen Text an einen Button zu senden, ausser du willst den Button umbenennen?
    Angenommen das Fenster hat 2 Edit's, dann mußt du dich schon entscheiden an welches Edit du etwas senden willst.

  • Stimmt.

    Mein Ziel ist ja, dass man mit Controlsend universal Texte an Fenster verschiedenen beliebiger Programme senden kann. Das Buttons genauso Klassen haben, habe ich gar nicht bedacht.
    Das Problem ist, ich kann die Klassen für mich selber ermitteln, aber jmd anderes vielleicht, wenn er/sie das Script benutzt.

    Im Grunde ist es also nicht möglich, das simpel und für jeden Nutzbar umzusetzen, schätze ich mal.

    • Offizieller Beitrag

    Wenn du es universell einsetzbar machen willst, mußt du trotzdem den User auswählen lassen, an welche Instance etwas gesendet wird.
    Das wird dir kein Script abnehmen, woher auch? Dein Script kann nicht entscheiden welches Control wichtig/richtig ist.

  • Ok, danke für die Hilfe.
    Werde wohl das gesamte Konzept nochmal überdenken und dann ein wenig umplanen :)
    LG