WinMove funzt net

  • hi,haber ein sehr seltsames Problem mit WinMove.

    Ich erstelle eine GUI mit guicreate. Das Handle wird in einem AutoitObject abgespeichert.
    Also $obj.hGUI=GuiCreate(BLABLA)

    soweit so gut..

    Will ich das Fenster dann bewegen mit WinMove(obj.hGUI,etc.) erhalte ich als Rückgabewert=0
    Das heisst also das Fenster wird nicht gefunden ????

    Irgendwie dämlich...Habe mir mal das Handle ausgeben lassen und es ist <> 0.

    Alternativ habe ich es auch mit _WINAPI_MoveWindow probiert. Das funktioniert zwar, änder aber dummerweise einige Attribute des Fensters, denke ich. Ich habe nämlich das Fenster mit WinSetTrans(...) halb durchsichtig gemacht,sobalt _WINAPI_MoveWindow ins Spiel kommt, wird das Fenster einfach gelöscht oder unsichtbar,ich weiss es nicht genau. Das passiert aber immer nur,wenn ich vorher WinSetTrans(...) benutze.

    Irgendwie habe ich sowieso das Gefühl,dass sich die Built-In AutoIT Funktionen nicht so recht mit den WINAPI-UDF vertragen

    Nochmal zusammengefasst:Ich will ein transparentes Fenster,dass ich bewegen kann.
    Hat jemand eine Idee?

    Gruß,
    david

    Einmal editiert, zuletzt von taugenix (17. September 2012 um 00:08)

    • Offizieller Beitrag

    Also $obj.hGUI=GuiCreate(BLABLA)


    Vielleicht zeigst du mal deinen Code. Das hier ist kein natives AutoIt und wäre nur mit der AutoItObject UDF machbar.
    AutoIt selbst ist keine objektorientierte Sprache.

    Mit nativem Code sieht das so aus:

    [autoit]

    $hGUI = GuiCreate(..)

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

    WinMove($hGUI,...)

    [/autoit]
    • Offizieller Beitrag

    Chesstiger, du solltest lernen die Hilfe zu lesen! ( <AutoIt> <Using AutoIt> <Window Titles and Text (Advanced)> )
    Statt Titel kannst du (was auch viel sinnvoller, da eindeutiger ist) immer das Handle verwenden! "When you have a handle you may use it in place of the title parameter in any of the function calls that use the title/text convention."

  • Danke für die schnellen Antworten. Ja das mit der Titelspezifikation überles ich mal :)

    Habe eben gemerkt,dass das ganze auch mit "nativen" Variablen scheitert...

    Sobalt man WinSetTrans(...) auf ein Fenster anwendet, kann man es nicht mehr bewegen.Schlimmer noch,es verschwindet komplett,sobald man es doch versucht.
    Also ich konnte das Problem einigermaßen einkreisen.
    Es hat wohl damit zu tun,dass das Fenster,dass ich verschieben möchte ein eingebettetes Child-Fenster einer Fremden Anwendung ist.Der Code dafür wäre aber zu Komplex,dass sich das jemand anschaut.
    Hier ein vereinfachtes Beispiel:

    [autoit]


    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1)
    GUISetOnEvent($GUI_EVENT_CLOSE,"_EXIT")
    Global $notePID=RUN("NOTEPAD.EXE")
    global $hNotePad=_GetHwndFromPID($notePID)

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

    global $hGui=GuiCreate("BLA")
    WinSetTrans($hGUI,"",150)
    guisetstate()
    DllCall("user32.dll", "int", "SetParent", "hwnd", $hGui, "hwnd", $hNotePad)

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

    HotKeySet("{SPACE}","_MyMove")
    while(true)
    sleep(300)
    WEnd

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

    func _EXIT()
    ProcessClose($notePID)
    exit
    EndFunc

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

    func _MyMove()
    WinMove($hGui,"",200,200)
    EndFunc
    Func _GetHwndFromPID($PID)
    local $hWnd = 0
    local $winlist2=0
    $stPID = DllStructCreate("int")
    Do
    $winlist2 = WinList()
    For $i = 1 To $winlist2[0][0]
    If $winlist2[$i][0] <> "" Then
    DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $winlist2[$i][1], "ptr", DllStructGetPtr($stPID))
    If DllStructGetData($stPID, 1) = $PID Then
    $hWnd = $winlist2[$i][1]
    ExitLoop
    EndIf
    EndIf
    Next
    Sleep(100)
    Until $hWnd <> 0
    Return $hWnd
    EndFunc ;==>_GetHwndFromPID

    [/autoit]

    Einmal editiert, zuletzt von taugenix (16. September 2012 um 22:18)

    • Offizieller Beitrag

    Also WinMove funktioniert tadellos, leider wird das Child nicht als MDI_CHILD registriert, dann brauchtest du es nicht separat bewegen, sondern die Msg vom Parent würde auch für das Child gelten.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $notePID = RUN("NOTEPAD.EXE")
    $hNotepad = WinWait('[Class:Notepad]')

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

    global $hGui = GuiCreate("BLA", -1, -1, -1, -1, -1, $WS_EX_MDICHILD, $hNotepad)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_EXIT")
    WinSetTrans($hGUI, "", 150)

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

    ;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : Parent = ' & WinGetTitle(_WinAPI_GetParent($hGui)) & @crlf) ;### Debug Console

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

    guisetstate(@SW_SHOW, $hGui)

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

    HotKeySet("{SPACE}","_MyMove")

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

    while(true)
    sleep(300)
    WEnd

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

    func _EXIT()
    ProcessClose($notePID)
    exit
    EndFunc

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

    func _MyMove()
    WinMove($hGui,"",200,200)
    EndFunc

    [/autoit]