通过 CMD 更新 HKCU\Control Panel\Colors Background 并立即应用?

通过 CMD 更新 HKCU\Control Panel\Colors Background 并立即应用?

大家好,提前感谢您的帮助!

每次我重新启动工作电脑时,组策略都会生效,并将系统的背景颜色更改为公司默认颜色。在 Windows 7 中,由于背景颜色较浅,因此所有图标文本都会变暗,无法通过深色壁纸阅读。此外,如果我远程访问我的机器并禁用 UI 选项以获得更流畅的体验,背景将是明亮的默认颜色,而不是壁纸……尽管如此,我本质上还是通过导航到“窗口颜色和外观”窗口并将桌面颜色设置为深色来手动将背景颜色更改为较暗的颜色。

窗户颜色、外观色彩亮丽。

因此,我开始寻找一种自动执行此更改的方法,我的第一个想法是创建一个简单的 BAT 脚本并从我的启动文件夹启动它。我已经弄清楚了如何更新此特定颜色更改的注册表项,但我似乎无法弄清楚如何使其生效,就像在“窗口颜色和外观”窗口中选择“应用”按钮强制更改一样。

以下是通过 CMD 进行的寄存器更改:

  • REG ADD "HKEY_CURRENT_USER\Control Panel\Colors" /v Background /t REG_SZ /d "0 0 0" /f

该命令似乎按预期更改了注册表值。但是,它从未更新我的实际桌面。关于如何让它应用注册表更改,您有什么想法吗?

以下是我已经尝试过的几个命令,但它们似乎不起作用:

  • RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters
  • RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True

我也尝试停止并重新启动桌面窗口管理器会话管理器,但颜色更改仍然没有应用:

  • NET STOP uxsms
  • NET START uxsms

抱歉,这个问题问得太长了。如能得到任何帮助,我将不胜感激!

答案1

即使您正确设置了注册表项,更改也不会生效,因为不会发送相应的“设置已更改”通知。这种rundll32方法虽然很常见,但却是错误的,而且只能偶然奏效。有关更多信息,请参阅在什么情况下可以使用rundll32来调用DLL中的函数?

更改桌面背景颜色的正确方法是使用SetSysColors函数,可立即使您的设置生效。它不会更新注册表,但这并不重要,因为每次登录时您的注册表似乎都会被吹走。不幸的是,它是一种本机方法,未在任何方便的命令行实用程序中公开。要调用它,我们可以使用 PowerShell!首先我们定义一个类型:

add-type -typedefinition "using System;`n using System.Runtime.InteropServices;`n public class PInvoke { [DllImport(`"user32.dll`")] public static extern bool SetSysColors(int cElements, int[] lpaElements, int[] lpaRgbValues); }"

(P/Invoke 定义由这个 Stack Overflow 问题)然后我们可以调用它:

[PInvoke]::SetSysColors(1, @(1), @(0xAA40C0))

运行该程序后,桌面会变成漂亮的粉红色。在我的示例中,颜色由最后一个参数决定0xAA40C0。三个字节中最高有效字节 ( AA) 为蓝色,下一个为绿色,最后一个为红色。该@符号创建一个数组,这正是函数所期望的。

要通过批处理脚本完成所有这些操作,请使用以下一行代码:

powershell -command add-type -typedefinition """"using System;`n using System.Runtime.InteropServices;`n public class PInvoke { [DllImport(`"""user32.dll`""")] public static extern bool SetSysColors(int cElements, int[] lpaElements, int[] lpaRgbValues); }""""; [PInvoke]::SetSysColors(1, @(1), @(0xAA40C0))

相关内容