WingetPos bei mehren Monitoren?

  • Hey Leute.
    Habe mal wieder eine Frage und wende mich damit mal wieder an euch.
    Um meine Frage spezifisch zu erklären, muss ich ein bisschen weiter ausholen:

    In meinen Skript lasse ich per

    AutoIt
    OnAutoItExitRegister("_SaveStateCheckBoxes")


    mir den Status alle Checkboxen auslesen und auch die Fenster Position ausgeben.
    Dies Speicher ich mir mit:

    AutoIt
    RegWrite("HKEY_CURRENT_USER\Software\IniStream", "Save_Config_Save", "REG_SZ", 1)


    &

    AutoIt
    RegWrite("HKEY_CURRENT_USER\Software\IniStream", "LP_X", "REG_SZ", $size[0])

    So sieht die Funktion komplett aus:


    Am Start lass ich mir das wieder ausgeben und speichere mir das in eine Variable speichern, danach lass ich die Form erstellen.

    AutoIt
    $LP_X=RegRead("HKEY_CURRENT_USER\Software\IniStream", "LP_X")
    $LP_Y=RegRead("HKEY_CURRENT_USER\Software\IniStream", "LP_Y")
    
    
    $IniStream = GUICreate("IniStream", 346, 538, $LP_X, $LP_Y)


    Aber klappt das auch so bei mehren Monitoren?
    Ich kann das leider nicht testen da ich keinen weiteren habe.

    MFG

  • Hab das mal eben schnell gecodet und getestet. Die Koordinaten werden abgespeichert, allerdings kann es sein das die Bildschirmanordnung das Script bei unterschiedlichen PCs anders positioniert werden kann.
    Bei mir habe ich z.B. auf den linkten Monitor negative Koordinaten aber ich könnte meine Settings so einstellen das ganz links 0 ist und ganz rechts 2x1920 statt ganz links -1920 und ganz rechts 1920.

  • Hallo @Tyh_Nel,

    @Oscar hat hier ein Skript (Tagezaehler) gepostet, in dem er zusätzlich noch sicherstellt, dass das Programm immer sichtbar ist, auch wenn sich das Setting ändert. (Wenn der zweite Monitor mal nicht angeschlossen ist, oder so). Könnte auch für dich nützlich sein.

    Grüße autoiter

    • Offizieller Beitrag

    Aber klappt das auch so bei mehren Monitoren?

    Ja, prinzipiell funktioniert das auch mit mehreren Monitoren!
    Und solange beim nächsten Programmstart nichts an der Anordnung/Auflösung der Monitore geändert wurde, wird das Fenster wieder an der alten Position geöffnet.
    Aufpassen musst Du, wenn Dein Programm im minimierten Zustand beendet werden kann, denn:

    Zitat

    WinGetPos() returns negative numbers such as -32000 for minimized windows

    Und wie autoiter bereits schrieb, kannst Du Dir bei meinem Script gern abschauen, wie man sicherstellen kann, dass das Fenster auch bei deaktiviertem zweiten Monitor angezeigt wird.
    Wobei es ja noch die Variante gibt, dass der Monitor zwar angeschlossen ist, aber die Auflösung und/oder Position geändert wurde.
    Will man auch den Fall berücksichtigen, wird es noch etwas aufwendiger.

    Zu dem, wie Du den Status der Checkboxen abspeicherst, möchte ich auch noch etwas anmerken:
    1. Du solltest Dich nicht darauf verlassen, dass die Werte von $GUI_CHECKED und $GUI_UNCHECKED für immer (bei späteren AutoIt-Versionen) 1 und 4 sind. Also lieber die entsprechenden Konstanten verwenden!
    2. Eine Checkbox kann nicht nur CHECKED/UNCHECKED sein. Es gibt auch noch den 3State-Mode, weshalb man sich angewöhnen sollte, den Status immer mit BitAnd(GuiCtrlRead($Checkbox), $GUI_CHECKED) abzufragen.
    3. Diese Konstruktion:

    AutoIt
    If GUICtrlRead($AutoConfigSave) = 1 Then
    	RegWrite("HKEY_CURRENT_USER\Software\IniStream", "Save_Config_Save", "REG_SZ", 1)
    ElseIf GUICtrlRead($AutoConfigSave) = 4 Then
    	RegWrite("HKEY_CURRENT_USER\Software\IniStream", "Save_Config_Save", "REG_SZ", 4)
    EndIf

    ist nicht nur aufgrund obiger Punkte "falsch", sondern man kann das auch in eine Zeile packen:

    AutoIt
    RegWrite("HKEY_CURRENT_USER\Software\IniStream", "Save_Config_Save", "REG_SZ", GUICtrlRead($AutoConfigSave))