2026-02-09 04:24:33 +01:00

74 lines
2.9 KiB
C#

using Photino.NET;
using System.Drawing;
using System.Runtime.InteropServices;
namespace BrikInstaller.Utils;
public static class WindowHelper {
private const float StandardDpi = 96.0f;
[DllImport("user32.dll")]
static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr LoadImage(IntPtr hinst, string lpszName, uint uType, int cxDesired, int cyDesired, uint fuLoad);
const int GWL_STYLE = -16;
const int WS_CAPTION = 0x00C00000;
const int WS_THICKFRAME = 0x00040000;
const int WS_MINIMIZEBOX = 0x00020000;
const int WS_MAXIMIZEBOX = 0x00010000;
const int WS_SYSMENU = 0x00080000;
const uint SWP_FRAMECHANGED = 0x0020;
const uint SWP_NOMOVE = 0x0002;
const uint SWP_NOSIZE = 0x0001;
const uint SWP_NOZORDER = 0x0004;
const uint WM_SETICON = 0x0080;
const IntPtr ICON_SMALL = 0;
const IntPtr ICON_BIG = 1;
const uint IMAGE_ICON = 1;
const uint LR_LOADFROMFILE = 0x00000010;
public static Size GetScaledSize(PhotinoWindow window, int logicalWidth, int logicalHeight) {
float currentDpi = window.ScreenDpi > 0 ? window.ScreenDpi : StandardDpi;
float scaleFactor = currentDpi / StandardDpi;
return new Size(
(int)(logicalWidth * scaleFactor),
(int)(logicalHeight * scaleFactor)
);
}
public static void setSize(PhotinoWindow window, int width, int height) {
Size targetSize = GetScaledSize(window, width, height);
window
.SetResizable(false)
.SetSize(targetSize)
.SetMinSize(targetSize.Width, targetSize.Height);
}
public static void RemoveTitleBar(PhotinoWindow window) {
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) {
IntPtr hWnd = window.WindowHandle;
int style = GetWindowLong(hWnd, GWL_STYLE);
style &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU);
SetWindowLong(hWnd, GWL_STYLE, style);
SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
}
}
public static void ForceTaskbarIcon(PhotinoWindow window, string iconPath) {
IntPtr hWnd = window.WindowHandle;
IntPtr hIcon = LoadImage(IntPtr.Zero, iconPath, IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
if (hIcon != IntPtr.Zero) {
SendMessage(hWnd, WM_SETICON, ICON_SMALL, hIcon);
SendMessage(hWnd, WM_SETICON, ICON_BIG, hIcon);
}
}
}