using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows; namespace SpineViewer.Natives { /// /// Win32 Sdk 包装类 /// public static class Win32 { public const int GWL_STYLE = -16; public const int WS_SIZEBOX = 0x40000; public const int WS_BORDER = 0x800000; public const int WS_VISIBLE = 0x10000000; public const int WS_CHILD = 0x40000000; public const int WS_POPUP = unchecked((int)0x80000000); public const int GWL_EXSTYLE = -20; public const int WS_EX_TOPMOST = 0x8; public const int WS_EX_TRANSPARENT = 0x20; public const int WS_EX_TOOLWINDOW = 0x80; public const int WS_EX_WINDOWEDGE = 0x100; public const int WS_EX_CLIENTEDGE = 0x200; public const int WS_EX_APPWINDOW = 0x40000; public const int WS_EX_LAYERED = 0x80000; public const int WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE; public const int WS_EX_NOACTIVATE = 0x8000000; public const uint LWA_COLORKEY = 0x1; public const uint LWA_ALPHA = 0x2; public const byte AC_SRC_OVER = 0x00; public const byte AC_SRC_ALPHA = 0x01; public const int ULW_COLORKEY = 0x00000001; public const int ULW_ALPHA = 0x00000002; public const int ULW_OPAQUE = 0x00000004; public const nint HWND_TOPMOST = -1; public const uint SWP_NOSIZE = 0x0001; public const uint SWP_NOMOVE = 0x0002; public const uint SWP_NOZORDER = 0x0004; public const uint SWP_FRAMECHANGED = 0x0020; public const int WM_SPAWN_WORKER = 0x052C; // 一个未公开的神秘消息 public const uint SMTO_NORMAL = 0x0000; public const uint SMTO_BLOCK = 0x0001; public const uint SMTO_ABORTIFHUNG = 0x0002; public const uint SMTO_NOTIMEOUTIFNOTHUNG = 0x0008; public const uint GA_PARENT = 1; public const uint GW_OWNER = 4; public const int SW_HIDE = 0; public const int SW_SHOWNORMAL = 1; public const int SW_SHOWMINIMIZED = 2; public const int SW_SHOWMAXIMIZED = 3; public const int SW_SHOWNOACTIVATE = 4; public const int SW_SHOW = 5; public const int SW_MINIMIZE = 6; public const int SW_SHOWMINNOACTIVE = 7; public const int SW_SHOWNA = 8; public const int SW_RESTORE = 9; public const int SW_SHOWDEFAULT = 10; public const uint MONITOR_DEFAULTTONEAREST = 2; [StructLayout(LayoutKind.Sequential)] public struct POINT { public int x; public int y; } [StructLayout(LayoutKind.Sequential)] public struct SIZE { public int cx; public int cy; } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct BLENDFUNCTION { public byte BlendOp; public byte BlendFlags; public byte SourceConstantAlpha; public byte AlphaFormat; } [StructLayout(LayoutKind.Sequential)] private struct LASTINPUTINFO { public uint cbSize; public uint dwTime; } [StructLayout(LayoutKind.Sequential)] public struct RECT { public int Left; public int Top; public int Right; public int Bottom; } [StructLayout(LayoutKind.Sequential)] private struct MONITORINFOEX { public uint cbSize; public RECT rcMonitor; public RECT rcWork; public uint dwFlags; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string szDevice; } [DllImport("user32.dll", SetLastError = true)] public static extern nint GetDC(nint hWnd); [DllImport("user32.dll", SetLastError = true)] public static extern int ReleaseDC(nint hWnd, nint hDC); [DllImport("user32.dll", SetLastError = true)] public static extern int SetWindowLong(nint hWnd, int nIndex, int dwNewLong); [DllImport("user32.dll", SetLastError = true)] public static extern int GetWindowLong(nint hWnd, int nIndex); [DllImport("user32.dll", SetLastError = true)] public static extern bool GetLayeredWindowAttributes(nint hWnd, ref uint crKey, ref byte bAlpha, ref uint dwFlags); [DllImport("user32.dll", SetLastError = true)] public static extern bool SetLayeredWindowAttributes(nint hWnd, uint pcrKey, byte pbAlpha, uint pdwFlags); [DllImport("user32.dll", SetLastError = true)] public static extern bool UpdateLayeredWindow(nint hWnd, nint hdcDst, nint pptDst, ref SIZE psize, nint hdcSrc, ref POINT pptSrc, int crKey, ref BLENDFUNCTION pblend, int dwFlags); [DllImport("user32.dll", SetLastError = true)] public static extern bool SetWindowPos(nint hWnd, nint hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); [DllImport("user32.dll", SetLastError = true)] public static extern uint GetDoubleClickTime(); [DllImport("user32.dll", SetLastError = true)] private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); [DllImport("user32.dll", SetLastError = true)] public static extern nint FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", SetLastError = true)] public static extern nint SendMessageTimeout(nint hWnd, uint Msg, nint wParam, nint lParam, uint fuFlags, uint uTimeout, out nint lpdwResult); [DllImport("user32.dll", SetLastError = true)] public static extern nint FindWindowEx(nint parentHandle, nint childAfter, string className, string windowTitle); [DllImport("user32.dll", SetLastError = true)] public static extern nint SetParent(nint hWndChild, nint hWndNewParent); [DllImport("user32.dll", SetLastError = true)] public static extern nint GetParent(nint hWnd); [DllImport("user32.dll", SetLastError = true)] public static extern nint GetAncestor(nint hWnd, uint gaFlags); [DllImport("user32.dll", SetLastError = true)] public static extern nint GetWindow(nint hWnd, uint uCmd); [DllImport("user32.dll", SetLastError = true)] public static extern bool ShowWindow(nint hWnd, int nCmdShow); [DllImport("gdi32.dll", SetLastError = true)] public static extern nint CreateCompatibleDC(nint hdc); [DllImport("gdi32.dll", SetLastError = true)] public static extern bool DeleteDC(nint hdc); [DllImport("gdi32.dll", SetLastError = true)] public static extern nint SelectObject(nint hdc, nint hgdiobj); [DllImport("gdi32.dll", SetLastError = true)] public static extern bool DeleteObject(nint hObject); [DllImport("user32.dll")] private static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags); [DllImport("user32.dll")] private static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFOEX lpmi); public static TimeSpan GetLastInputElapsedTime() { LASTINPUTINFO lastInputInfo = new(); lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo); uint idleTimeMillis = 1000; if (GetLastInputInfo(ref lastInputInfo)) { uint tickCount = (uint)Environment.TickCount; uint lastInputTick = lastInputInfo.dwTime; idleTimeMillis = tickCount - lastInputTick; } return TimeSpan.FromMilliseconds(idleTimeMillis); } public static nint GetWorkerW() { var progman = FindWindow("Progman", null); if (progman == nint.Zero) return nint.Zero; nint hWnd = FindWindowEx(progman, 0, "WorkerW", null); Debug.WriteLine($"HWND(Progman.WorkerW): {hWnd:x8}"); return hWnd; } public static bool GetScreenResolution(IntPtr hwnd, out uint width, out uint height) { IntPtr hMon = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); var mi = new MONITORINFOEX { cbSize = (uint)Marshal.SizeOf() }; if (GetMonitorInfo(hMon, ref mi)) { int widthPx = mi.rcMonitor.Right - mi.rcMonitor.Left; int heightPx = mi.rcMonitor.Bottom - mi.rcMonitor.Top; width = (uint)widthPx; height = (uint)heightPx; return true; } width = height = 0; return false; } } }