- Offizieller Beitrag
Bitnugger hatte in diesem Thread die Funktion _WinAPI_GetWindowPlacement() vorgeschlagen, um die Positionsdaten eines Fensters bei Programmende zu speichern.
Tatsächlich ist diese WinApi-Funktion sehr gut dafür geeignet. Vor allem, weil man damit auf einen Schlag alle Fensterdaten abspeichern kann. Also auch, ob maximiert/minimiert.
So habe ich mir gedacht: Am besten beim Programmende gleich die ganze Struktur speichern und beim nächsten Programmstart wiederherstellen.
Dafür habe ich hier mal eine kleine UDF geschrieben, die diese beiden Funktionen ("_LoadWindowPlacement" und "_SaveWindowPlacement") zur Verfügung stellt.
Außerdem gibt es noch eine Funktion, um sicherzustellen, dass sich das Fenster auf dem Desktop befindet. Benutzer von mehreren Bildschirmen werden das nachvollziehen können: Wenn man ein Fenster auf dem zweiten Bildschirm positioniert hat und dieser zweite Bildschirm beim nächsten Programmstart gerade nicht aktiviert ist. Dann wird das Fenster an einer Position geöffnet, die man nicht erreichen kann. In dem Fall hilft meine Funktion "_WindowOnDesktop". Sie verschiebt das Fenster dann auf den sichtbaren Desktop.
Beispiel:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include 'WindowPlacement.au3'
Global Const $sPlacementFile = @ScriptDir & '\WindowPlacement.bin'
Global $iWidth = 320, $iHeight = 200, $iPosX = -1, $iPosY = -1
Global $sStyle = BitOR($WS_CAPTION, $WS_POPUPWINDOW, $WS_SIZEBOX, $WS_MINIMIZEBOX, $WS_MAXIMIZEBOX)
Global $hGui = GUICreate('Testfenster1', $iWidth, $iHeight, $iPosX, $iPosY, $sStyle)
Global $hGui2 = GUICreate('Testfenster2', $iWidth, $iHeight, $iPosX, $iPosY, $sStyle)
Global $ret = _LoadWindowPlacement($hGui, $sPlacementFile, 0) ; die Positionsdaten aus Block 1 laden und fuer Fenster 1 setzen
If @error Then GUISetState(@SW_SHOW, $hGui)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : LoadWindowPlacement1 = ' & $ret & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Global $ret = _LoadWindowPlacement($hGui2, $sPlacementFile, 1) ; die Positionsdaten aus Block 2 laden und fuer Fenster 2 setzen
If @error Then GUISetState(@SW_SHOW, $hGui2)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : LoadWindowPlacement2 = ' & $ret & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$ret = _WindowOnDesktop($hGui) ; Sicherstellen, dass sich das Fenster 1 auf dem Desktop befindet
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : WindowOnDesktop1 = ' & $ret & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$ret = _WindowOnDesktop($hGui2) ; Sicherstellen, dass sich das Fenster 2 auf dem Desktop befindet
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : WindowOnDesktop2 = ' & $ret & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
$ret = _SaveWindowPlacement($hGui, $sPlacementFile, 0) ; die Positionsdaten fuer Fenster 1 in Block 1 speichern
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : SaveWindowPlacement1 = ' & $ret & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$ret = _SaveWindowPlacement($hGui2, $sPlacementFile, 1) ; die Positionsdaten fuer Fenster 2 in Block 2 speichern
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : SaveWindowPlacement2 = ' & $ret & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Exit
EndSwitch
WEnd
Alles anzeigen
Edit 13.04.18 Neue Version 1.1:
- Man kann jetzt die Daten von mehreren Fenstern (GUIs) in einer einzelnen Datei speichern (pro Fenster 44 Bytes = 1 Block).
- Die Funktion "_WindowOnDesktop" noch etwas angepasst. Danke Bitnugger!