-
-
Save anonymous/8a5986d1ee19b2bb4921a5383ac39d00 to your computer and use it in GitHub Desktop.
WPF Window Placement
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.IO; | |
using System.Runtime.InteropServices; | |
using System.Text; | |
using System.Windows; | |
using System.Windows.Interop; | |
using System.Xml; | |
using System.Xml.Serialization; | |
namespace Allscripts.Analytics.TestingTools.UI | |
{ | |
internal static class WindowExtensions | |
{ | |
public static void SetPlacement(this Window window, string placementXml) | |
{ | |
WindowPlacement.SetPlacement(new WindowInteropHelper(window).Handle, placementXml); | |
} | |
public static string GetPlacement(this Window window) | |
{ | |
return WindowPlacement.GetPlacement(new WindowInteropHelper(window).Handle); | |
} | |
} | |
[Serializable] | |
[StructLayout(LayoutKind.Sequential)] | |
public struct RECT | |
{ | |
public int Left; | |
public int Top; | |
public int Right; | |
public int Bottom; | |
public RECT(int left, int top, int right, int bottom) | |
{ | |
this.Left = left; | |
this.Top = top; | |
this.Right = right; | |
this.Bottom = bottom; | |
} | |
} | |
[Serializable] | |
[StructLayout(LayoutKind.Sequential)] | |
public struct POINT | |
{ | |
public int X; | |
public int Y; | |
public POINT(int x, int y) | |
{ | |
this.X = x; | |
this.Y = y; | |
} | |
} | |
[Serializable] | |
[StructLayout(LayoutKind.Sequential)] | |
public struct WINDOWPLACEMENT | |
{ | |
public int length; | |
public int flags; | |
public int showCmd; | |
public POINT minPosition; | |
public POINT maxPosition; | |
public RECT normalPosition; | |
} | |
public static class WindowPlacement | |
{ | |
private static Encoding encoding = new UTF8Encoding(); | |
private static XmlSerializer serializer = new XmlSerializer(typeof(WINDOWPLACEMENT)); | |
[DllImport("user32.dll")] | |
private static extern bool SetWindowPlacement(IntPtr hWnd, [In] ref WINDOWPLACEMENT lpwndpl); | |
[DllImport("user32.dll")] | |
private static extern bool GetWindowPlacement(IntPtr hWnd, out WINDOWPLACEMENT lpwndpl); | |
private const int SW_SHOWNORMAL = 1; | |
private const int SW_SHOWMINIMIZED = 2; | |
public static void SetPlacement(IntPtr windowHandle, string placementXml) | |
{ | |
if (string.IsNullOrEmpty(placementXml)) | |
{ | |
return; | |
} | |
WINDOWPLACEMENT placement; | |
byte[] xmlBytes = encoding.GetBytes(placementXml); | |
try | |
{ | |
using (MemoryStream memoryStream = new MemoryStream(xmlBytes)) | |
{ | |
placement = (WINDOWPLACEMENT)serializer.Deserialize(memoryStream); | |
} | |
placement.length = Marshal.SizeOf(typeof(WINDOWPLACEMENT)); | |
placement.flags = 0; | |
placement.showCmd = (placement.showCmd == SW_SHOWMINIMIZED ? SW_SHOWNORMAL : placement.showCmd); | |
SetWindowPlacement(windowHandle, ref placement); | |
} | |
catch (InvalidOperationException) | |
{ | |
// Parsing placement XML failed. Fail silently. | |
} | |
} | |
public static string GetPlacement(IntPtr windowHandle) | |
{ | |
WINDOWPLACEMENT placement = new WINDOWPLACEMENT(); | |
GetWindowPlacement(windowHandle, out placement); | |
using (MemoryStream memoryStream = new MemoryStream()) | |
{ | |
using (XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8)) | |
{ | |
serializer.Serialize(xmlTextWriter, placement); | |
byte[] xmlBytes = memoryStream.ToArray(); | |
return encoding.GetString(xmlBytes); | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment