mirror of
https://github.com/WowUp/WowUp.git
synced 2026-04-23 15:27:03 -04:00
132 lines
4.1 KiB
C#
132 lines
4.1 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Xml;
|
|
using System.Xml.Serialization;
|
|
|
|
namespace WowUp.WPF.Utilities
|
|
{
|
|
public static class WindowUtilities
|
|
{
|
|
public enum ShowWindowEnum
|
|
{
|
|
Hide = 0,
|
|
ShowNormal = 1, ShowMinimized = 2, ShowMaximized = 3,
|
|
Maximize = 3, ShowNormalNoActivate = 4, Show = 5,
|
|
Minimize = 6, ShowMinNoActivate = 7, ShowNoActivate = 8,
|
|
Restore = 9, ShowDefault = 10, ForceMinimized = 11
|
|
};
|
|
|
|
// RECT structure required by WINDOWPLACEMENT structure
|
|
[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)
|
|
{
|
|
Left = left;
|
|
Top = top;
|
|
Right = right;
|
|
Bottom = bottom;
|
|
}
|
|
}
|
|
|
|
// POINT structure required by WINDOWPLACEMENT structure
|
|
[Serializable]
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct POINT
|
|
{
|
|
public int X;
|
|
public int Y;
|
|
|
|
public POINT(int x, int y)
|
|
{
|
|
X = x;
|
|
Y = y;
|
|
}
|
|
}
|
|
|
|
// WINDOWPLACEMENT stores the position, size, and state of a window
|
|
[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;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct MINMAXINFO
|
|
{
|
|
public POINT ptReserved;
|
|
public POINT ptMaxSize;
|
|
public POINT ptMaxPosition;
|
|
public POINT ptMinTrackSize;
|
|
public POINT ptMaxTrackSize;
|
|
};
|
|
|
|
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)
|
|
{
|
|
var 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);
|
|
}
|
|
}
|
|
}
|