Mouse-Benutzung in (aktivem) Child-Fenster funktioniert nicht

  • Hallo zusammen,

    vielleicht hate jemand von euch ja schon mal ein ähnliches Problem und kann mir einen Tip geben...

    Ich versuche ein Programm, dass mit der Mouse bedient wird, in ein von mir erstelltes GUI einzubetten.
    Das klappt auch, allerdings kann ich das Programm, das ich eingebunden habe, nun nicht mehr mit der Mouse bedienen.
    Mit dem Befehl "WinActivate" aktiviere ich es auch, aber das hat leider keinen Erfolg.
    Woran kann es liegen?
    Kann etwas im Hintergrund diesen Befehl blockieren? Ist ein weiterer Befehl nötig? Geht es einfach nicht, weil es nur ein "Child"-Fenster ist?

    Zum Programmaufbau: Ich erstelle ein Gui-Fenster und ein Child-Fenster in diesem Gui. Dann öffne ich das Programm, das ich hereinziehen möchte und ziehe es in das Child Fenster. Das heißt, ich habe Folgende Struktur: GUI(Parent) -> FensterInGui(Child von GUI) -> Programm(Child von FensterInGui).
    Dann erstelle ich im GUI ein Menü.
    In einer While-Schleife werden dann die Eingaben des Benutzers abgefragt und, je nach Cursorposition, das Programmfenster aktiviert.

    Könnt ihr mir helfen?
    Viele Grüße
    Meike

  • Kommt auf das Programm an, um welches Programm handelt es sich den?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Mmm, das ist ein Programm eines Touchscreen-Herstellers. Das simuliert den Screen.
    Diese Antwort hilft sicher nicht...

  • Diese Antwort hilft sicher nicht...

    Naja, gibt doch mal zu das du nicht gerade viele Infos anbietest :sleeping:

    Es wäre z.B hilfreich wenn du dein bisher geschriebenes Script hier mal zeigst, denn niemand hat hier ein Glaskugel ;)

    Auf deiner Aussage hin das du mit Child-Fenster arbeitest frage ich mich ob bei dir vieleicht nur folgende Option im Script fehlt ?(

    [autoit]

    Opt("WinSearchChildren", 1) ; 0=nein, 1=Auch Unter(child)-fenster suchen

    [/autoit]
  • Ok... mm... der Code ist etwas umfangreicher, ich kopier vielleicht einfach mal die relevanten Stellen...


    [autoit]


    ; LARS Fenstertitel setzen
    $sLARS = "DEFAULT - LARS - LASAL Runtime System"
    ; LARS Fenster suchen und ggf. starten
    $hLARS = WinGetHandle($sLARS)

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

    ; Position und Größe benötigen wir für die spätere Positionierung innerhalb des GUI
    $posLars = WinGetPos($sLARS)
    ; LARS vorerst verstecken
    WinSetState($hLARS, '', @SW_HIDE)

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

    ; das Hauptfenster erstellen (grüner Kasten)
    if $ONLINE_NET_MODE Then
    $hGUI = GUICreate($V_BDE_TITEL, $V_LEFT_WIDTH+$V_RESOLUTION_X+$V_RIGHT_WIDTH, $V_TOP_SPACE+$V_RESOLUTION_Y+$V_BOTTOM_SPACE+40, -1, -1)
    Else
    $hGUI = GUICreate($V_TITEL, $V_LEFT_WIDTH+$V_RESOLUTION_X+$V_RIGHT_WIDTH, $V_TOP_SPACE+$V_RESOLUTION_Y+$V_BOTTOM_SPACE, -1, -1)
    EndIf

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

    GUISetState(@SW_SHOW)
    ; und auch gleich wieder minimieren (verstecken geht nicht, und es muss unbedingt vorher angezeigt
    ; werden, bevor die anderen Fenster reingehängt werden können)
    GUISetState(@SW_MINIMIZE)

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

    ; den Hintergrund einfärben
    if $ONLINE_NET_MODE Then
    $hAnzeige = GUICtrlCreateInput("", 0, 0, $V_LEFT_WIDTH+$V_RESOLUTION_X+$V_RIGHT_WIDTH, $V_TOP_SPACE+$V_RESOLUTION_Y+$V_BOTTOM_SPACE+40)
    Else
    $hAnzeige = GUICtrlCreateInput("", 0, 0, $V_LEFT_WIDTH+$V_RESOLUTION_X+$V_RIGHT_WIDTH, $V_TOP_SPACE+$V_RESOLUTION_Y+$V_BOTTOM_SPACE)
    EndIf
    GUICtrlSetBkColor(-1, $V_BACKGROUND)
    GUICtrlSetState(-1, $GUI_DISABLE)
    ; den Rahmen um den LARS-Bereich optisch vergrößern
    if $ONLINE_NET_MODE Then
    $hAnzeige = GUICtrlCreateInput("", $V_LEFT_WIDTH-$V_BLACK_FRAME, $V_TOP_SPACE-$V_BLACK_FRAME+$V_GUI_LARS_COR+$V_ONLINENET_OFFSET, $V_RESOLUTION_X+($V_BLACK_FRAME*2), $V_RESOLUTION_Y+($V_BLACK_FRAME*2))
    Else
    $hAnzeige = GUICtrlCreateInput("", $V_LEFT_WIDTH-$V_BLACK_FRAME, $V_TOP_SPACE-$V_BLACK_FRAME+$V_GUI_LARS_COR, $V_RESOLUTION_X+($V_BLACK_FRAME*2), $V_RESOLUTION_Y+($V_BLACK_FRAME*2))
    EndIf
    GUICtrlSetBkColor(-1, $V_FRAME_COLOR)
    GUICtrlSetState(-1, $GUI_DISABLE)
    ; Fenster erstellen, in das dann das LARS-Fenster reingezogen wird
    if $ONLINE_NET_MODE Then
    $hEmbed = GUICreate("", $V_RESOLUTION_X, $V_RESOLUTION_Y, $V_LEFT_WIDTH, $V_TOP_SPACE+$V_GUI_LARS_COR+$V_ONLINENET_OFFSET, $WS_POPUP, -1, $hGUI)
    Else
    $hEmbed = GUICreate("", $V_RESOLUTION_X, $V_RESOLUTION_Y, $V_LEFT_WIDTH, $V_TOP_SPACE+$V_GUI_LARS_COR, $WS_POPUP, -1, $hGUI)
    EndIf
    _WinAPI_SetParent($hEmbed, $hGUI)
    $result =WinSetState($hEmbed, '', @SW_SHOW)
    ; das LARS-Fenster 'reinziehen'...
    _WinAPI_SetParent($hLARS, $hEmbed)
    $result =DllCall("user32.dll", "long", "SetWindowLongPtr", "hwnd", $hLARS, "int", -20, "long", 0x80000000 + 0x400000 + 0x40000 )
    $result =GuiSetStyle(BitOr($WS_POPUP, $WS_BORDER), '', $hLARS)
    ; ...und maximieren
    $result =WinSetState($hLARS, '', @SW_MAXIMIZE)
    $result =WinSetState($hLARS, '', @SW_ENABLE)
    ;$result =WinSetState($hLARS, '', @SW_SHOW)
    GUISetState()

    [/autoit]

    So, dann wird noch ein bisschen an der Optik gebastelt und ein Menü erzeugt.
    Danach geht es dann in die While-Schleife:

    [autoit]


    GUISwitch($hGUI)
    ; die Grafik ist jetzt fertig, das Fenster kann also wieder angezeigt werden
    GUISetState(@SW_RESTORE, $hGUI)
    GUISetState(@SW_HIDE, $hGUI)
    GUISetState(@SW_SHOW, $hGUI)

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

    Opt("MouseCoordMode",0)

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

    $hMousePosition = MouseGetPos()
    WinActivate($hLars)
    WinWaitActive($hLars)

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

    While 1
    _Focus()
    $sMod = ""
    $aEvent = GUIGetMsg(1)
    $msg = $aEvent[0]

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

    Select
    ;die ganzen Menüoptionen
    EndSelect
    WEnd

    [/autoit]

    Und die Funktion Focus habe ich mal hier im Forum gefunden:

    [autoit]


    Func _Focus(); <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    Local $iOld_Opt_MCM = Opt("MouseCoordMode", 0)
    Local $iMouseX = MouseGetPos(0)
    Local $iMouseY = MouseGetPos(1)
    If @AutoItX64 Then
    Local $tPoint = DllStructCreate("int X;int Y")
    DllStructSetData ( $tPoint, "X", $iMouseX)
    DllStructSetData ( $tPoint, "Y", $iMouseY)
    Local $tPoint64 = DllStructCreate("int64", DllStructGetPtr($tPoint))
    Local $aHwnd = DllCall("user32.dll", "hwnd", "ChildWindowFromPointEx", "hwnd", $hGUI,"int64", DllStructGetData($tPoint64, 1), "uint", 0)
    Else
    Local $aHwnd = DllCall("user32.dll", "hwnd", "ChildWindowFromPointEx", "hwnd", $hGUI, "uint", $iMouseX, "uint", $iMouseY, "uint", 0)
    EndIf

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

    Switch $aHwnd[0]
    Case $hLars, $hEmbed
    if $bLarsHover == False Then
    WinActivate($hLars)
    WinWaitActive($hLars)
    $bLarsHover = True
    $hWaitCur = _LoadCursor($OCR_NORMAL)
    _SetSystemCursor($hWaitCur,$OIC_HAND)
    EndIf
    Case Else
    $bLarsHover = False
    $hWaitCur = _LoadCursor($OIC_HAND)
    _SetSystemCursor($hWaitCur,$OCR_CROSS)
    EndSwitch
    Opt("MouseCoordMode", $iOld_Opt_MCM)
    EndFunc

    [/autoit]

    Hilft das?

  • Ich hatte noch ein sehr seltsames Verhalten:
    Nachdem ich die von chip empfohlene Option

    Zitat

    Opt("WinSearchChildren", 1) ; 0=nein, 1=Auch Unter(child)-fenster suchen


    eingefügt hatte, funktionierte das Skipt einmal. Nach dem Neustart wieder nicht mehr und auch nie wieder :cursing: .
    Das ist ja echt mal ein sehr zufälliges Programm... wie kann ich jemals einem Skript trauen, was mit Autoit geschrieben wurde.. ?(