Ich benutze für sowas
GetWindowPlacement/
SetWindowPlacement. Damit erspart man sich z.B. die Prüfung auf zwischenzeitlich nicht mehr vorhandene Monitore etc. Aufrufen tue ich das normalerweise im OnShow/OnHide.
Hier mal die Schreib-Routine als Beispiel:
Delphi-Quellcode:
procedure WriteWindowPlacement(AIni: TCustomIniFile; const Section, NamePrefix: string; Form: TCustomForm);
var
wp: TWindowPlacement;
sl: TStringList;
s: string;
begin
wp.length := SizeOf(TWindowPlacement);
GetWindowPlacement(Form.Handle, @wp);
sl := TStringList.Create;
sl.Capacity := 9;
try
sl.Append(IntToStr(wp.showCmd));
sl.Append(IntToStr(wp.ptMinPosition.X));
sl.Append(IntToStr(wp.ptMinPosition.Y));
sl.Append(IntToStr(wp.ptMaxPosition.X));
sl.Append(IntToStr(wp.ptMaxPosition.Y));
sl.Append(IntToStr(wp.rcNormalPosition.Left));
sl.Append(IntToStr(wp.rcNormalPosition.Top));
sl.Append(IntToStr(wp.rcNormalPosition.Right));
sl.Append(IntToStr(wp.rcNormalPosition.Bottom));
s := EncodeDelimitedText('(', ';', ')', sl); // Hier "sl" irgendwie in einen einzeiligen String wandeln (sl.DelimitedText oder so).
finally
sl.Free;
end;
AIni.WriteString(Section, NamePrefix + 'WindowPlacement', s);
end;