Executable als childGUI in parentGUI mit RunAs

  • Hallo zusammen,

    ich habe eine mit Autoit erstellte EXE die eine childGUI($gchild) erzeugt und zur ParentGUI($_parent_ID) gehören soll.

    Code
    $gchild = GUICreate("Child", $GUIchildwidth, $GUIchildheight, (($_parent_width/2)-($GUIchildwidth/2)), (($_parent_height/2)-($GUIchildheight/2)), $WS_POPUPWINDOW, $WS_EX_MDICHILD + $WS_EX_ACCEPTFILES, $_parent_ID)

    Von meiner ParentGUI rufe ich die EXE mit RunAs auf und übergebe das Handle der ParentGUI ($_parent_ID) via Kommadozeilenparameter an die ChildGUI. Dort wird es auch korrekt übernommen.

    Wenn ich in der EXE nun z.B. einen Aufruf starte um das Parent zu disablen, passiert leider nichts.

    Code
    GUISetState(@SW_DISABLE, $_parent_ID)

    Wenn ich eine ChildGUI direkt in der ParentGUI erzeuge und interagiere geht alles wie ich möchte.

    Wie erreiche ich das auch mit einem "EXE-child" welches ich mittel RunAs aufrufe?

    (Wenn ich meinen Text jetzt so lese, klingt es irgendwie kompliziert. Ich hoffe Ihr versteht, wo mein Problem liegt. :D )

  • Das liegt daran dass die GUI Funktionen nur für AutoIt interne Fenster ausgelegt sind (sprich: Gui's via GUICreate im gleichen Programmcode). Auf externe Fenster kannst du leider mit den Funktionen nicht zugreifen.

    Glücklicherweise liefert AutoIt aber auch die WinSetState() Funktion mit. Damit solltest du keine Probleme haben.

    Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2

  • Prima, Danke. Damit kann ich schonmal was anfangen. Ich kann schonmal das Parent vom Child aus manipulieren (z.B. disablen).

    Mein Child erscheint als "On-Top"-Gui auf dem Parent. Jetzt würde ich es gerne noch irgendwie realisieren, dass ich das Parent verschieben kann und das Child sich innerhalt des Parents mit bewegt.

  • Schwierig, normalerweise kannst du dann dafür einfach den ExStyle $WS_EX_MDICHILD verwenden...
    Jedoch funktioniert dass für 2 unterschiedliche Prozesse nicht:

    [autoit]

    #include <GUIConstants.au3>

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

    If Not $CmdLine[0] Then
    $hGUI = GUICreate('', 800, 600)
    GUISetState()

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

    Run(StringFormat('"%s" "%s" "%s"', @AutoItExe, @ScriptFullPath, $hGUI))
    Else
    $hChild = GUICreate('', 400, 300, -1, -1, -1, $WS_EX_MDICHILD, $CmdLine[1])
    GUISetState()
    EndIf

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

    While GUIGetMsg() <> $GUI_EVENT_CLOSE
    WEnd

    [/autoit]

    Aber ich lass mir da mal noch eine (elegante) Lösung einfallen. Sonst halt viele If-Abfragen und Fenster Positionen speichern. ^^

  • Soa, nach ein wenig Schlaf und ausprobieren habe ich das Problem über die Windows Message WM_MOVING gelöst.
    Der Code hat Kommentare und ist hoffentlich so verständlich.
    Viel Spaß damit! :)

    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    ; ACHTUNG
    ; Code wurde so geschrieben dass es NUR in der SciTE funktioniert (direktes ausführen per [F5])
    ; Prinzip per Windows Messages bleibt aber gleich

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <GUIConstants.au3>
    #include <StructureConstants.au3>

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    If Not $CmdLine[0] Then
    $hGUI = GUICreate('', 800, 600)
    GUIRegisterMsg($WM_MOVING, 'WM_MOVING') ; Wird aufgerufen wenn das Fenster bewegt wird
    GUISetState()

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

    $iPID = Run(StringFormat('"%s" "%s" "%s"', @AutoItExe, @ScriptFullPath, $hGUI), @ScriptDir, @SW_SHOW, 0x2) ; Startet einen zweiten Prozess des Programmes

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

    Do
    $hChild = StdoutRead($iPID) ; Wartet auf das Handle der Child GUI
    Until $hChild

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

    StdioClose($iPID)
    Else
    $hChild = GUICreate('', 400, 300, -1, -1, -1, -1, $CmdLine[1])
    GUISetState()

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

    ConsoleWrite($hChild) ; Sendet das Handle der Child GUI zum Parent Fenster
    EndIf

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    While GUIGetMsg() <> -3
    WEnd

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func WM_MOVING($hWndGUI, $MsgID, $WParam, $LParam)
    Local $aiGUI = WinGetPos($hGUI) ; Fensterposition der Parent GUI vor der Verschiebung
    Local $aiChild = WinGetPos($hChild) ; Fensterposition der Child GUI
    Local $tRect = DllStructCreate($tagRECT, $LParam) ; Fensterposition der Parent GUI nach der Verschiebung

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

    If WinExists($hChild) Then WinMove($hChild, '', $aiChild[0] - ($aiGUI[0] - $tRect.Left), $aiChild[1] - ($aiGUI[1] - $tRect.Top)) ; Neue Child GUI Position berechnen und verschieben

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

    Return $GUI_RUNDEFMSG
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]
  • :rock: Funktioniert 1A. Vielen Dank für Deine Hilfe!

    Kleine Änderung noch in der Funktion "WM_MOVING".

    [autoit]


    Func WM_MOVING($hWndGUI, $MsgID, $WParam, $LParam)
    Local $aiGUI = WinGetPos($hGUI) ; Fensterposition der Parent GUI vor der Verschiebung
    Local $aiChild = WinGetPos($hChild) ; Fensterposition der Child GUI
    Local $tRect = DllStructCreate($tagRECT, $LParam) ; Fensterposition der Parent GUI nach der Verschiebung

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

    If WinExists($hChild) AND $hChild <> "" Then WinMove($hChild, '', $aiChild[0] - ($aiGUI[0] - $tRect.Left), $aiChild[1] - ($aiGUI[1] - $tRect.Top)) ; Neue Child GUI Position berechnen und verschieben

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

    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    Da $hChild Global definiert ist, ist die Variable immer da, es steht halt nicht immer ein Handle zum entsprechenden Child drin. Deshalb noch in der If-Anweisung das

    Code
    $hChild <> ""

    .
    Sonst würde die Verschiebung der GUI alle Childs betreffen.

    2 Mal editiert, zuletzt von CRouch (19. November 2014 um 13:30)