DWM(デスクトップウィンドウマネージャー)を使ってみた
タイトルバーのスタイルを変えるだけなら簡単だったけど、それ以外のコントロールに同処理を使っても反応がない。
これもいろいろ調べてたけどいいやり方は見つかってなさそう。
public class DarkForm : Form { protected override void OnLoad(EventArgs e) { base.OnLoad(e); int value = 1; _ = NativeMethods.DwmSetWindowAttribute(Handle, NativeMethods.DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE, ref value, (uint)Marshal.SizeOf(typeof(int))); } private static class NativeMethods { [DllImport("dwmapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern int DwmSetWindowAttribute(IntPtr hwnd, DWMWINDOWATTRIBUTE attribute, ref int pvAttribute, uint cbAttribute); public enum DWMWINDOWATTRIBUTE { DWMWA_USE_IMMERSIVE_DARK_MODE = 20, DWMWA_WINDOW_CORNER_PREFERENCE = 33, DWMWA_MICA_EFFECT = 1029, DWMWA_LAST } } }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); int value = 1; _ = NativeMethods.DwmSetWindowAttribute(Handle, NativeMethods.DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE, ref value, (uint)Marshal.SizeOf(typeof(int))); if (DesignMode) return; SuspendLayout(); ToDarkMode(this); ResumeLayout(); } private static void ToDarkMode(Control ctrl) { ctrl.ForeColor = Color.White; ctrl.BackColor = Color.FromArgb(56, 56, 56); foreach (Control child in ctrl.Controls) { if (child == null) continue; ToDarkMode(child); } }
色を管理するクラスを作ったり、細かい微調整がいりそうなので対応コストに見合ったやり方ではないでしょう。