Mettre à jour HKCU \ Panneau de configuration \ Couleurs Fond via CMD et appliquer immédiatement?

4

Bonjour à tous et merci d'avance pour toute aide!

Chaque fois que je redémarre mon ordinateur au travail, la stratégie de groupe entre en vigueur et modifie la couleur d'arrière-plan de mon système sur celle de l'entreprise. Sous Windows 7, la couleur de l'arrière-plan étant plus claire, tout le texte des icônes est sombre et impossible à lire avec mon fond d'écran sombre. De plus, si je me connecte à ma machine et désactive les options de l'interface utilisateur pour une expérience plus fluide, l'arrière-plan correspond à la couleur par défaut très lumineuse plutôt qu'à un fond d'écran ... Cela dit, je recourt essentiellement à la modification manuelle de la couleur d'arrière-plan en une couleur plus sombre. accédez à la fenêtre "Couleur et apparence de la fenêtre" et définissez la couleur du bureau sur une couleur sombre.

Window Color and Appearance with Bright Color.

J'ai donc commencé à chercher un moyen d'automatiser cette modification et ma première idée est de créer un script BAT simple et de le lancer à partir de mon dossier de démarrage. J'ai découvert comment mettre à jour l'entrée de registre pour ce changement de couleur particulier, mais je n'arrive pas à comprendre comment le faire prendre en compte de la même manière qu'en sélectionnant le bouton "Appliquer" dans la "Couleur et apparence de la fenêtre". "fenêtre force le changement.

Voici le changement de registre via CMD:

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

Cette commande semble modifier la valeur du Registre comme prévu. Mais, il ne met jamais à jour mon bureau actuel. Des idées sur la façon de le faire appliquer le changement de registre?

Voici quelques commandes que j'ai déjà essayées et qui ne semblent pas faire l'affaire:

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

J'ai également essayé d'arrêter et de redémarrer le gestionnaire de sessions de Desktop Window Manager, mais le changement de couleur n'est toujours pas appliqué:

  • NET STOP uxsms
  • NET START uxsms

Je m'excuse pour la longue question posée. Toute aide est grandement appréciée!

Urk
la source

Réponses:

5

Même si vous définissez correctement l'entrée de registre, la modification ne prend pas effet car la notification "paramètre modifié" appropriée n'est pas envoyée. le rundll32 Cette approche, bien que communément conseillée, est incorrecte et ne fonctionne que par hasard. Pour plus d'informations, voir Dans quelles circonstances puis-je utiliser rundll32 pour appeler une fonction dans une DLL?

La bonne façon de changer la couleur d’arrière-plan du bureau consiste à utiliser le SetSysColors fonction, qui met vos paramètres en vigueur immédiatement. Il ne met pas à jour le registre, mais cela n'a pas beaucoup d'importance, car le vôtre semble s'envoler chaque fois que vous vous connectez. Malheureusement, c'est une méthode native, qui n'est exposée dans aucun utilitaire de ligne de commande commode. Pour l'appeler, nous pouvons utiliser PowerShell! Nous définissons d'abord un type:

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 définition avec l'aimable autorisation de cette question de débordement de pile .) Ensuite, nous pouvons l'appeler:

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

Après avoir exécuté cela, le bureau devient un joli rose. La couleur est déterminée par le dernier argument, 0xAA40C0 dans mon exemple. L'octet le plus significatif des trois ( AA ) est bleu, le suivant est vert et le dernier est rouge. le @ La notation crée un tableau, ce à quoi la fonction s'attend.

Pour faire tout cela à partir d'un script batch, utilisez ce one-liner:

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))
Ben N
la source
Un moyen facile d’inverser la situation (par exemple, si vous vous êtes trompé en définissant la couleur)?
Ploni
@Ploni Exécutez simplement la commande à nouveau avec la nouvelle couleur souhaitée ou déconnectez-vous puis reconnectez-vous pour la réinitialiser à ce qui est dans le registre. (Cela ne sauvegarde pas sauf si vous ajustez le registre comme indiqué dans la question.)
Ben N
Addendum au commentaire précédent: il se plaindra du type déjà défini si vous exécutez le Add-Type à nouveau dans la même session PowerShell. Si vous souhaitez refaire le changement avec une couleur différente, utilisez uniquement celle commençant par [PInvoke]ou fermez et rouvrez PowerShell.
Ben N
@BenN Excellente réponse, gentil monsieur! Cela fonctionne très bien pour moi lors des tests initiaux, j'apprécie beaucoup le temps. Je dirai que votre addendum n'est pas un problème pour moi; PS ne semble pas se préoccuper d'exécuter la première commande pour moi, ni dans PS ni dans PS ISE. Comme PS est installé par défaut sur Windows, je pense que cette réponse est certainement la meilleure solution et répond définitivement à mes préoccupations. Merci encore!
Urk