Hilfe bei SetOnTop und Bildschirmfixierung

  • Hallo zusammen,

    ich habe eine Frage zur Realisierbarkeit eines Scripts.

    Ist es möglich einem Programm die folgenden Parameter mitzugeben?

    1. Muss im Vordergrund bleiben -> WinSetOnTop("Neues Textdokument (2).txt - Editor", "", 1)
    2. Muss am oberen Bildschirmrand fixiert werden.
    3. Wenn sich andere Programme Maximieren, sollen sie dies unter z.B dem Notepad machen. Also denken, das ab dem Notepad der ausfüllbare Bildschirm "zuende" ist.


    Für Hilfe wäre ich sehr dankbar. :)

  • Wenn es sich um deine eigene GUI handelt kannst du mit

    [autoit]

    $WS_EX_TOPMOST

    [/autoit]

    die Gui vor allen anderen lassen. Um die Postion einzustellen kannst du, für deine eigene Gui, im 4+5 Parameter die Position 0, 0, einstellen. Wenn es sich um deine eigene Gui handelt brauchst du dir auch keine Sorgen zu machen das ein anderes Fenster dieses überdecken kann, wenn der Style $WS_EX_TOPMOST eingestellt wurde.

    Für ein fremdes Fenster, z.B. der Editor, kannst du, wie du schon weißt, mit

    [autoit]

    WinSetonTop

    [/autoit]

    das Programm in den Vordergrund nehmen. Mit

    [autoit]

    WinMove

    [/autoit]

    kannst du x und y Koordinate einstellen. Damit es nicht überlagert wird, von einem anderen Fenster, kannst du WinSetOnTop in einem Loop laufen lassen. Es gibt bestimmt noch andere Möglichkeiten, dies waren nur ein paar wenige.

  • Hi und danke für deine Antwort Bad Bunny

    mit dem code:

    [autoit]

    while 1 WinSetOnTop("Neues Textdokument (2).txt - Editor", "", 1)WEnd

    [/autoit]

    ist das Textdokument zwar immer im Vordergrund sobald ich aber den Chrome starte und Maximiere wird dieser hinter das Texdokument gelegt. Soweit so gut.
    Das Problem ist aber immer noch, das der Rahmen des Texeditors als "Ende" des Bildschirmes agieren soll und wenn Programme Maximiert werden diese nicht hinter sondern unter dem Texteditor erscheinen sollen.

    Komisch geschrieben ich hoffe man versteht was ich möchte.

    Kennst du da vlt. eine Möglichkeit?

  • Das Problem ist aber immer noch, das der Rahmen des Texeditors als "Ende" des Bildschirmes agieren soll und wenn Programme Maximiert werden diese nicht hinter sondern unter dem Texteditor erscheinen sollen.


    dafür musst du dir eine Fensterliste erstellen lassen

    [autoit]

    WinList

    [/autoit]

    und diese laufend in einer schleife überprüfen. Bei Veränderung mit

    [autoit]

    WinMove

    [/autoit]

    das entsprechende Fenster verschieben.

    mfg autoBert

  • Ich habs jetzt so verstanden das die Fenster überall hindürfen außer exaxt hinter den Editor, also ungefähr so:

    Spoiler anzeigen


    ********************************************************
    ********************************************************
    *******************Editor*****************************
    ********************************************************
    ********************************************************


    überall wo die Sterne + "Editor" ist, dahinter darf dann theoretischnur der Desktop sein. Richtig? Ich gehe jetzt mal davon aus. ich würde:
    1.)-Überprüfen welche Fenster alles aktiv sind

    [autoit]

    $aAktiv=WinList()

    [/autoit]

    ;Müsste auch mit WinActive und einem Parameter gehen, mir fällt der gerade ncith ein... irg was mit "[Aktive]" oder so...
    2.)-gucken wo sie sich befinden (x+y Koordinaten)

    [autoit]

    $aWinPos=WinGetPos()

    [/autoit]


    3.)-gucken ob sich x/y im Feld 0,0, Editor Höhe, Editor Bereite befindet, wenn ja dann das Fenster was sich im Editor Feld, oder besser gesagt dadrunter befindet woanders hinschieben, (z.B. an den Rand des Editor Feldes)

    [autoit]


    $aWinSize=WinGetClientSize("Name des Editors")
    If $aWinPos[0] <=$aWinSize[0] and $aWinPos[1] <= $aWinSize[1] Then WinMove ("Das Fenster was nicht dahinsoll", $aWinSize[0]+1,$aWinSize[1]+1

    [/autoit]

    Frei aus dem Kopf, evtl Fehler können denk ich per Hand korigiert werden :)

  • Zitat

    Ich habs jetzt so verstanden das die Fenster überall hindürfen außer exaxt hinter den Editor, also ungefähr so:

    Genau so. In meinem Fall soll ein Programm oben am Monitor angeheftet werden.

    Spoiler anzeigen

    Programm
    ************
    ************

    Zitat


    3.)-gucken ob sich x/y im Feld 0,0, Editor Höhe, Editor Bereite befindet, wenn ja dann das Fenster was sich im Editor Feld, oder besser gesagt dadrunter befindet woanders hinschieben, (z.B. an den Rand des Editor Feldes)

    Kann man einfach Programme die Maximiert werden verschieben? Werden die nicht dann aus dem Dekstop Bereich geschoben?


    Kannst du mir evtl. ein Beispielt schreiben ich komme aus der VBA und bin noch ziemlich neu was AutoIT angeht?

  • Man kann den Desktop für maximierte Fenster einschränken:
    Desktop "einschränken"


    Ich habe den Code mal so angepasst das eine Leiste oben entsteht, wie sie gebraucht wird. Das klappt schon mal super. Jedoch kann man auch keine Programme Oder Fenster in den ereich schieben. Gibt es eine möglichkeit dem Code einen Programm start mit Run hinzuzufügen, welches sich in dem "gesperten Bereich öffnet?

    [autoit]


    Const $SPI_SETWORKAREA = 47Const $SPIF_SENDCHANGE = 2
    $tRECT = DllStructCreate('int;int;int;int')DllStructSetData($tRECT, 1, 0) ; leftDllStructSetData($tRECT, 2, 100) ; topDllStructSetData($tRECT, 3, 1650) ; rightDllStructSetData($tRECT, 4, 1050) ; buttom_WinAPI_SystemParametersInfo($SPI_SETWORKAREA, 0, DllStructGetPtr($tRECT), $SPIF_SENDCHANGE)

    [/autoit]
    • Offizieller Beitrag
    Zitat

    Jedoch kann man auch keine Programme Oder Fenster in den ereich schieben.

    Doch kann man, zumindest bein Win7.
    Der Workarea Bereich wirkt sich nur auf das Automatische resizen eines Fensters aus.
    Wenn man z.B. ein Fenster maximiert wird es in der Größe der Workarea angezeigt.

    Edit: Bei WinXp kann man die Fenster auch aus dem Workareabereich verschieben, wenn sie nicht maximiert sind.
    Bein Win7 gibt es diese Einschränkung nicht.

  • Danke für eure Hilfe ich habe es jetzt hinbekommen wie ich es wollte.

    Hier mein Code vlt. kann ich anderen damit weiterhelfen. Werte wie Auflösung müssen individuell angepasst werden sofern man eine andere hat.

    [autoit]

    ;Verbietet das Beenden des Scriptes
    Break(0)

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

    ;Bildschirm wird angepasst
    #include <winapi.au3>

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

    Const $SPI_SETWORKAREA = 47
    Const $SPIF_SENDCHANGE = 2

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

    $tRECT = DllStructCreate('int;int;int;int')
    DllStructSetData($tRECT, 1, 0) ; left
    DllStructSetData($tRECT, 2, 100) ; top
    DllStructSetData($tRECT, 3, 1680) ; right
    DllStructSetData($tRECT, 4, 1010) ; buttom
    _WinAPI_SystemParametersInfo($SPI_SETWORKAREA, 0, DllStructGetPtr($tRECT), $SPIF_SENDCHANGE)

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

    ;Programm wird gestartet und gewartet bis es gestartet ist.
    Run ("Notepad.exe")
    WinWaitActive ("Unbenannt - Editor")

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

    ;Per Schleife wird das Verschieben verboten und das Fenster immer in Vordergrund gesetzt
    ;Sobald das Programm geschlossen wird, wird der alte Arbeitsfläche des Desktopes wieder hergestellt.

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

    while 1
    If WinExists("Unbenannt - Editor") Then
    WinMove ("Unbenannt - Editor", "", 0, 0, 1680, 95)
    WinSetOnTop("Unbenannt - Editor","", 1)
    Else
    $tRECT = DllStructCreate('int;int;int;int')
    DllStructSetData($tRECT, 1, 0) ; left
    DllStructSetData($tRECT, 2, 0) ; top
    DllStructSetData($tRECT, 3, 1680) ; right
    DllStructSetData($tRECT, 4, 1010) ; buttom
    _WinAPI_SystemParametersInfo($SPI_SETWORKAREA, 0, DllStructGetPtr($tRECT), $SPIF_SENDCHANGE)
    ExitLoop
    EndIf
    Wend

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


    Gruß Czerni