4

Всем привет и заранее спасибо за любую помощь!

Каждый раз, когда я перезагружаю свой ПК на работе, групповая политика вступает в силу и меняет цвет фона моей системы по умолчанию на компанию. В Windows 7 из-за того, что цвет фона более светлый, весь текст значков становится темным и его невозможно прочитать на темных обоях. Кроме того, если я удаленно подключаюсь к своей машине и отключаю параметры интерфейса для более плавного восприятия, фон будет очень ярким цветом по умолчанию, а не обоями ... Все это говорит о том, что я, по сути, прибегаю к ручному изменению цвета фона на более темный, перейдя в окно "Цвет и внешний вид окна" и установив темный цвет рабочего стола.

Цвет окна и внешний вид с ярким цветом.

Итак, я начал искать способ автоматизировать это изменение, и моя первая мысль - создать простой 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 ответ1

5

Даже если вы правильно настраиваете запись реестра, изменения не вступают в силу, потому что соответствующее уведомление об изменении параметров не отправляется. Подход 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 определение любезно предоставлено на вопрос переполнения стека.) Тогда мы можем назвать это:

[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))

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .