Input eines anderen Fensters/Programms

  • Hallo,
    ich wollte mal wissen, wie man etwas in das Inputfeld eines anderen Fensters sendet, obwohl dies minimiert ist. Also mich interessiert es generell, wie das funktioniert und nicht nur bei einem minimierten Fenster.

    Soweit ich weiß, muss man den Handle dieses Fensters haben und mit diesem arbeiten. Bloß wie? Ich habe nun den Handle von dem Fenster und will etwas in ein Inputfeld senden/schreiben, ohne dass das Fenster im vordergrund bzw. sogar maximiert ist.

    Ich hoffe, dass ihr versteht, was ich meine und mir helfen könnt. ;)

    Mfg Rey

  • Hilfe lesen hilft:

    Zitat

    ControlSend

    Sendet eine Folge von Zeichen (Tastendrücken) an ein Control
    ...
    ControlSend arbeitet ähnlich wie Send, aber es kann Tastendrücke direkt an ein beliebiges Fenster bzw. Control senden und nicht nur an das gerade aktive Fenster.

  • Ja, du liegst schon richtig.
    Du brauchst das Handle oder den Titel/Text, des Fensters und die ID des Controls, in deinem Fall die ID des Input-Felds.
    Damit kannst du dann Funktionen wie

    Spoiler anzeigen

    ControlClick Sendet einen Mausklick-Befehl an das angegebene Control.

    ControlCommand Sendet einen Befehl an ein Control.

    ControlDisable Sperrt/deaktivert ein Control.

    ControlEnable Gibt ein gesperrtes (disabled) Control frei.

    ControlFocus Setzt den Eingabefokus auf ein bestimmtes Control in einem Fenster.

    ControlGetFocus Gibt den Klassennamen des Controls zurück, das den (Eingabe-) Fokus in einem bestimmten Fenster hat.

    ControlGetHandle Erfragt den internen "handle" (Prozessidentifizierungscode) eines Controls.

    ControlGetPos Erfragt die Position und die Größe eines Controls relativ zu seinem Fenster.

    ControlGetText Erfragt Text vom Control.

    ControlHide Versteckt ein Control.

    ControlListView Sendet einen Befehl an ein ListView32 Control.

    ControlMove Verschiebt ein Control in einem Fenster.

    ControlSend Sendet eine Folge von Zeichen (Tastendrücken) an ein Control

    ControlSetText Schreibt einen neuen Text in ein Control.

    ControlShow Zeigt ein verstecktes Control an.

    ControlTreeView Sendet einen Befehl an ein TreeView32 Control.

    StatusbarGetText Liest den Text der Statusbar, soweit es sich um ein Standard Control handelt.


    benutzen. ;)

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

  • Hey :)

    Als erstes brauchst du das Handle des Fensters. Dafür gibt es verschiedene Möglichkeiten:

    [autoit]

    WinActivate()
    WinActive()
    WinWait()
    WinWaitActive()
    _WinAPI_GetFocus()
    _WinAPI_GetForegroundWindow()
    ;~ Für dein Vorhaben wäre WinActive geeignet
    ;~ Oder du nimmst das AutoIt Info Window Tool

    [/autoit]

    Als nächstes benötigst du die ID des Input Controls. Da gibt es verschiedene Möglichkeiten.

    Wenn du das Handle und die ID hast, kannst du mit den Control Funktionen arbeiten.

    [autoit]

    ControlSend()
    ControlSetText()

    [/autoit]


    Wenn es noch zu irgendwas Fragen gibt, immer nachfragen :P


    Mfg. MG

  • Danke danke :)

    Bei CrontrolSend() muss man nicht unbedingt den Titel des Fensters angeben oder? Der Handle und die ID reicht doch ja?

    Mfg Rey

  • Entweder der Titel oder das Handle :)

    Beides ist Möglich :P

    So! Und du hast gesagt, dass da auch noch die ID des Input Controls rein muss, aber wo denn bei ControlSend()? Oder habe ich grade den Handle und die ID vertauscht?

    [autoit]

    ControlSend("","",$asSplit[2],"Lalala")

    [/autoit]

    Mfg Rey

  • Danke, es klappt so ziemlich alles. Nur AutoIt v3 Window Info liest bei dem Fenster "0x000303F2" als Handle und mein Programm sagt mir, dass es "0x000203E6" sei. Die ID der Inputbox habe ich mit Window Info festgestellt und ist angeblich 1.

    Spoiler anzeigen
    [autoit]

    $var = WinList()

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 to $var[0][0]
    If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
    $item1 = GUICtrlCreateListViewItem($var[$i][0] & "|" & $var[$i][1], $list_window)
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Func IsVisible($handle)
    If BitAnd(WinGetState($handle),2) Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;~
    ;~
    ;~

    [/autoit] [autoit][/autoit] [autoit]

    $asSplit = StringSplit(GuiCtrlRead(GuiCtrlRead($list_window),2),"|")

    [/autoit]

    Also ist "$asSplit[1]" der Name des Fensters und "$asSplit[2]" müsste dann ja der Handle sein oder?

  • Also, ich habe mich etwas vertan, da ich von der Inputbox den Handle mit dem von dem Fenster, dass die Inputbox beinhaltet, verglichen habe. Nun müsste ich wissen, wie ich mein Programm den Handle der Inputbox auslesen lasse.

    Mfg Rey