This repository has been archived on 2022-08-05. You can view files and clone it, but cannot push or open issues or pull requests.
CC-Functions/W32/Wnd32.cs

269 lines
8.9 KiB
C#
Raw Normal View History

2019-09-07 10:12:24 +02:00
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace CC_Functions.W32
{
2019-10-05 16:37:31 +02:00
public sealed class Wnd32 : IEquatable<Wnd32>
2019-09-07 10:12:24 +02:00
{
#region Exposed
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
#region CreateInstance
2019-11-29 21:27:24 +01:00
private Wnd32(IntPtr wndref) => hWnd = wndref;
2019-09-07 10:12:24 +02:00
public static Wnd32 fromHandle(IntPtr handle) => new Wnd32(handle);
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
public static Wnd32 fromMetadata(string lpClassName = null, string lpWindowName = null) => fromHandle(FindWindow(lpClassName, lpWindowName));
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
public static Wnd32 fromPoint(Point point) => fromHandle(WindowFromPoint(point.X, point.Y));
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
public static Wnd32 fromForm(Form form) => fromHandle(form.Handle);
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
public static Wnd32 foreground() => fromHandle(GetForegroundWindow());
2019-11-29 21:27:24 +01:00
#endregion CreateInstance
2019-09-07 10:12:24 +02:00
#region InstanceActions
2019-11-29 21:27:24 +01:00
2019-09-11 11:22:16 +02:00
public string title
{
get {
2019-09-07 10:12:24 +02:00
int length = GetWindowTextLength(hWnd);
StringBuilder sb = new StringBuilder(length + 1);
GetWindowText(hWnd, sb, sb.Capacity);
return sb.ToString();
2019-09-11 11:22:16 +02:00
}
set {
2019-09-07 10:12:24 +02:00
SetWindowText(hWnd, value);
2019-09-11 11:22:16 +02:00
}
}
2019-11-29 21:27:24 +01:00
2019-09-11 11:22:16 +02:00
public Rectangle position
{
get {
2019-09-07 10:12:24 +02:00
RECT Rect = new RECT();
GetWindowRect(hWnd, ref Rect);
return new Rectangle(new Point(Rect.left, Rect.top), new Size(Rect.right - Rect.left, Rect.bottom - Rect.top));
2019-09-11 11:22:16 +02:00
}
set {
2019-09-07 10:12:24 +02:00
RECT Rect = new RECT();
GetWindowRect(hWnd, ref Rect);
MoveWindow(hWnd, value.X, value.Y, value.Width, value.Height, true);
2019-09-11 11:22:16 +02:00
}
}
2019-11-29 21:27:24 +01:00
2019-09-11 11:22:16 +02:00
public bool isForeground
{
get {
2019-09-07 10:12:24 +02:00
return GetForegroundWindow() == hWnd;
2019-09-11 11:22:16 +02:00
}
set {
2019-09-07 10:12:24 +02:00
if (value)
SetForegroundWindow(hWnd);
else
throw new InvalidOperationException("You can't set a Window not to be in the foreground. Move another one over it!");
}
}
2019-11-29 21:27:24 +01:00
2019-09-11 11:22:16 +02:00
public bool enabled
{
get {
2019-09-07 10:12:24 +02:00
return IsWindowEnabled(hWnd);
2019-09-11 11:22:16 +02:00
}
set {
2019-09-07 10:12:24 +02:00
EnableWindow(hWnd, value);
}
}
2019-11-29 21:27:24 +01:00
2019-09-11 11:22:16 +02:00
public Icon icon
{
get {
var hicon = SendMessage(hWnd, 0x7F, 1, 0);
if (hicon == IntPtr.Zero)
hicon = SendMessage(hWnd, 0x7F, 0, 0);
if (hicon == IntPtr.Zero)
hicon = SendMessage(hWnd, 0x7F, 2, 0);
return Icon.FromHandle(hicon);
}
}
2019-11-29 21:27:24 +01:00
2019-09-11 11:22:16 +02:00
public bool shown
{
2019-11-29 21:27:24 +01:00
get {
return IsWindowVisible(hWnd);
}
2019-09-11 11:22:16 +02:00
set {
if (value)
ShowWindow(hWnd, 9);
else
ShowWindow(hWnd, 0);
}
}
2019-11-29 21:27:24 +01:00
public string className
{
get {
StringBuilder ClassName = new StringBuilder(256);
_ = GetClassName(hWnd, ClassName, ClassName.Capacity);
return ClassName.ToString();
}
}
2019-09-11 11:22:16 +02:00
public FormWindowState state
{
get {
int style = (int)GetWindowLong(hWnd, -16);
if ((style & 0x01000000) == 0x01000000)
{
return FormWindowState.Maximized;
}
else if ((style & 0x20000000) == 0x20000000)
{
return FormWindowState.Minimized;
}
else
{
return FormWindowState.Normal;
}
}
set {
switch (value)
{
case FormWindowState.Minimized:
ShowWindow(hWnd, 11);
break;
2019-11-29 21:27:24 +01:00
2019-09-11 11:22:16 +02:00
case FormWindowState.Normal:
ShowWindow(hWnd, 1);
break;
2019-11-29 21:27:24 +01:00
2019-09-11 11:22:16 +02:00
case FormWindowState.Maximized:
ShowWindow(hWnd, 3);
break;
}
}
}
2019-11-29 21:27:24 +01:00
public void MakeOverlay() => overlay = true;
public bool overlay
{
set {
Rectangle tmp = position;
_ = SetWindowPos(hWnd, value ? HWND_TOPMOST : HWND_NOTOPMOST, tmp.X, tmp.Y, tmp.Width, tmp.Height, value ? SWP_NOMOVE | SWP_NOSIZE : 0);
}
}
2019-09-07 10:12:24 +02:00
public bool Destroy()
{
if (DestroyWindow(hWnd))
return true;
else
throw new Exception("Failed.");
}
public bool stillExists => IsWindow(hWnd);
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
public override string ToString() => hWnd.ToString() + "; " + title + "; " + position.ToString();
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
public override bool Equals(object obj) => Equals(obj as Wnd32);
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
public bool Equals(Wnd32 other) => other != null && EqualityComparer<IntPtr>.Default.Equals(hWnd, other.hWnd);
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
public override int GetHashCode() => -75345830 + EqualityComparer<IntPtr>.Default.GetHashCode(hWnd);
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
public static bool operator ==(Wnd32 left, Wnd32 right) => EqualityComparer<Wnd32>.Default.Equals(left, right);
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
public static bool operator !=(Wnd32 left, Wnd32 right) => !(left == right);
2019-11-29 21:27:24 +01:00
#endregion InstanceActions
#endregion Exposed
2019-09-07 10:12:24 +02:00
#region W32
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
public IntPtr hWnd;
2019-11-29 21:27:24 +01:00
2019-09-07 10:12:24 +02:00
[DllImport("user32.dll")]
2019-11-29 21:27:24 +01:00
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWindowVisible(IntPtr hWnd);
2019-09-07 10:12:24 +02:00
2019-11-29 21:27:24 +01:00
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
private static extern long GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
2019-09-07 10:12:24 +02:00
[DllImport("user32.dll")]
2019-11-29 21:27:24 +01:00
private static extern IntPtr GetForegroundWindow();
2019-09-07 10:12:24 +02:00
2019-11-29 21:27:24 +01:00
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(int xPoint, int yPoint);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern bool SetWindowText(IntPtr hWnd, string lpString);
2019-09-07 10:12:24 +02:00
[DllImport("user32.dll", SetLastError = true)]
2019-11-29 21:27:24 +01:00
private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
2019-09-07 10:12:24 +02:00
[DllImport("user32.dll")]
2019-11-29 21:27:24 +01:00
private static extern bool SetForegroundWindow(IntPtr hWnd);
2019-09-07 10:12:24 +02:00
[DllImport("user32.dll")]
2019-11-29 21:27:24 +01:00
private static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
2019-09-07 10:12:24 +02:00
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
2019-11-29 21:27:24 +01:00
private static extern bool IsWindowEnabled(IntPtr hWnd);
2019-09-07 10:12:24 +02:00
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
2019-11-29 21:27:24 +01:00
private static extern bool DestroyWindow(IntPtr hwnd);
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
private static readonly IntPtr HWND_TOP = new IntPtr(0);
private static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
private const UInt32 SWP_NOSIZE = 0x0001;
private const UInt32 SWP_NOMOVE = 0x0002;
2019-09-07 10:12:24 +02:00
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
2019-11-29 21:27:24 +01:00
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
2019-09-07 10:12:24 +02:00
2019-11-29 21:27:24 +01:00
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
2019-09-07 10:12:24 +02:00
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, ExactSpelling = true, SetLastError = true)]
2019-11-29 21:27:24 +01:00
private static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect);
2019-09-07 10:12:24 +02:00
2019-11-29 21:27:24 +01:00
private struct RECT
2019-09-07 10:12:24 +02:00
{
public int left;
public int top;
public int right;
public int bottom;
}
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
2019-11-29 21:27:24 +01:00
private static extern int GetWindowTextLength(IntPtr hWnd);
2019-09-07 10:12:24 +02:00
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
2019-11-29 21:27:24 +01:00
private static extern bool IsWindow(IntPtr hWnd);
2019-09-11 11:22:16 +02:00
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
2019-11-29 21:27:24 +01:00
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
2019-09-11 11:22:16 +02:00
[DllImport("user32.dll")]
2019-11-29 21:27:24 +01:00
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
2019-09-11 11:22:16 +02:00
[DllImport("user32.dll", SetLastError = true)]
2019-11-29 21:27:24 +01:00
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
#endregion W32
2019-09-07 10:12:24 +02:00
}
2019-11-29 21:27:24 +01:00
}