using System; using System.Runtime.InteropServices; namespace PrivacyGlass { internal static class Native { [Flags] private enum DwmBlurBehindFlags : uint { DWM_BB_ENABLE = 0x00000001, DWM_BB_BLURREGION = 0x00000002, DWM_BB_TRANSITIONONMAXIMIZED = 0x00000004 } [StructLayout(LayoutKind.Sequential)] private struct DWM_BLURBEHIND { public DwmBlurBehindFlags dwFlags; public bool fEnable; public IntPtr hRgnBlur; public bool fTransitionOnMaximized; } [DllImport("dwmapi.dll")] private static extern int DwmEnableBlurBehindWindow( IntPtr hWnd, ref DWM_BLURBEHIND pBlurBehind); // Window styles public const int WS_CHILD = 0x40000000; public const int WS_VISIBLE = 0x10000000; // Extended styles public const int WS_EX_TOPMOST = 0x00000008; public const int WS_EX_LAYERED = 0x00080000; public const int WS_EX_TRANSPARENT = 0x00000020; public const int GWL_EXSTYLE = -20; // ----- Magnification API ----- [DllImport("Magnification.dll", SetLastError = true)] internal static extern bool MagInitialize(); [DllImport("Magnification.dll", SetLastError = true)] internal static extern bool MagUninitialize(); [DllImport("Magnification.dll", SetLastError = true)] internal static extern bool MagSetWindowSource(IntPtr hwnd, RECT rect); [DllImport("Magnification.dll", SetLastError = true)] internal static extern bool MagSetColorEffect(IntPtr hwnd, ref MAGCOLOREFFECT effect); // ----- User32 stuff ----- [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)] internal static extern IntPtr CreateWindowEx( int dwExStyle, string lpClassName, string lpWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam); [DllImport("user32.dll")] internal static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex); [DllImport("user32.dll")] internal static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong); [DllImport("user32.dll")] internal static extern bool SetWindowPos( IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); // structures [StructLayout(LayoutKind.Sequential)] internal struct RECT { public int left; public int top; public int right; public int bottom; } [StructLayout(LayoutKind.Sequential)] internal struct MAGCOLOREFFECT { // 5x5 color matrix (row-major) [MarshalAs(UnmanagedType.ByValArray, SizeConst = 25)] public float[] transform; } /// /// Strong privacy colour effect: desaturated + darkened. /// Not a geometric blur, but kills readability hard. /// internal static MAGCOLOREFFECT CreatePrivacyEffect() { var fx = new MAGCOLOREFFECT { transform = new float[25] }; // We’ll map R,G,B all to the same gray value and darken it. // Gray = (R+G+B)/3 * factor float factor = 0.25f; // 0..1, lower = darker float g = factor / 3f; // Row 0: R' fx.transform[0] = g; // R fx.transform[1] = g; // G fx.transform[2] = g; // B // Row 1: G' fx.transform[5] = g; fx.transform[6] = g; fx.transform[7] = g; // Row 2: B' fx.transform[10] = g; fx.transform[11] = g; fx.transform[12] = g; // Row 3: A' = A fx.transform[18] = 1.0f; // Row 4: w' (bias) – leave as identity fx.transform[24] = 1.0f; return fx; } [DllImport("Magnification.dll", SetLastError = true)] internal static extern bool MagSetWindowTransform( IntPtr hwnd, ref MAGTRANSFORM pTransform); [StructLayout(LayoutKind.Sequential)] internal struct MAGTRANSFORM { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)] public float[] v; // 3x3 matrix } } }