亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Windows 10 上的 WinForms 深色標題欄

Windows 10 上的 WinForms 深色標題欄

C#
12345678_0001 2023-07-09 10:01:30
我有一個 WinForms 應用程序,它會自動調整為 Windows 10 上的深色/淺色主題。我的問題是,無論用戶選擇哪個主題,窗口的標題欄始終保持白色。頂部是當前的,底部是我想要的(用 Photoshop 模擬)參見explorer例如。這不是 UWP 應用程序,但它在 Windows 1903 及更高版本上使用深色標題欄(當選擇深色主題時)。我怎樣才能實現同樣的目標?我不想使用任何自定義標題欄,因為我希望應用程序的外觀和行為也像舊 Windows 版本上的任何本機應用程序一樣。
查看完整描述

3 回答

?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

因此,經過長時間的搜索,我終于找到了這個問題的答案。技巧是使用dwmapi.dll'sDwmSetWindowAttribute并將未記錄的常量傳遞DWMWA_USE_IMMERSIVE_DARK_MODE到函數中。在 C# 中,其代碼看起來有點像這樣(適用于 WinForms 和 WPF):


/*

using System.Runtime.InteropServices;

*/


[DllImport("dwmapi.dll")]

private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);


private const int DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19;

private const int DWMWA_USE_IMMERSIVE_DARK_MODE = 20;


private static bool UseImmersiveDarkMode(IntPtr handle, bool enabled)

{

    if (IsWindows10OrGreater(17763))

    {

        var attribute = DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1;

        if (IsWindows10OrGreater(18985))

        {

            attribute = DWMWA_USE_IMMERSIVE_DARK_MODE;

        }


        int useImmersiveDarkMode = enabled ? 1 : 0;

        return DwmSetWindowAttribute(handle, (int)attribute, ref useImmersiveDarkMode, sizeof(int)) == 0;

    }


    return false;

}


private static bool IsWindows10OrGreater(int build = -1)

{

    return Environment.OSVersion.Version.Major >= 10 && Environment.OSVersion.Version.Build >= build;

}


查看完整回答
反對 回復 2023-07-09
?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

最快的方法:


[DllImport("DwmApi")] //System.Runtime.InteropServices

private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, int[] attrValue, int attrSize);


protected override void OnHandleCreated(EventArgs e)

{

    if (DwmSetWindowAttribute(Handle, 19, new[] { 1 }, 4) != 0)

        DwmSetWindowAttribute(Handle, 20, new[] { 1 }, 4);

}


查看完整回答
反對 回復 2023-07-09
?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

請記住,對于 .net fw 4.8.1 及之前版本,返回的版本不好,在 .Net6 中修復,這里是一個片段(.Net 5 不受管理):


? ? private static bool IsWindows10OrGreater(int build = -1)

? ? {

? ? ? ? return WindowsVersion() >= 10 && WindowsBuildNumber() >= build;

? ? }


? ? public static int WindowsVersion()

? ? {

? ? ?//for .Net4.8 and Minor

? ? ?#if NETFRAMEWORK

? ? ? ? int result = 10;

? ? ? ? var reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");

? ? ? ? string[] productName = reg.GetValue("ProductName").ToString().Split((char)32);

? ? ? ? int.TryParse(productName[1], out result);

? ? ? ? return result;

? ? ?#else

? ? ? ? //fixed in .Net6

? ? ? ? return System.Environment.OSVersion.Version.Major;

? ? ?#endif

? ? }


? ? public static int WindowsBuildNumber()

? ? {

? ? ? ? //for .Net4.8 and Minor

? ? #if NETFRAMEWORK

? ? ? ? int result = 22000;

? ? ? ? var reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");

? ? ? ? string buildNumber = reg.GetValue("CurrentBuildNumber").ToString();

? ? ? ? int.TryParse(buildNumber, out result);

? ? ? ? return result;

? ? #endif


? ? #if NET

? ? ? ? //fixed in .Net6

? ? ? ? return System.Environment.OSVersion.Version.Build;

? ? #endif

? ? }


查看完整回答
反對 回復 2023-07-09
  • 3 回答
  • 0 關注
  • 249 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號