Как изменить тему в Windows 7 с помощью скрипта PowerShell?

4

Я хотел бы иметь сценарий, который изменит текущую тему Windows 7. Я нашел запись в реестре, где она хранится, но мне, очевидно, нужно предпринять некоторые дальнейшие действия, чтобы Windows загрузила тему. Что я должен делать?

Вот скрипт, который я пытаюсь использовать, но он не работает (реестр обновлен, но тема не изменена):

######################################
# Change theme by updating registry. #
######################################

# Define argument which defines which theme to apply. 
param ( [string] $theme = $(Read-Host -prompt "Theme") )

# Define the themes we know about.
$knownThemes = @{ "myTheme" = "mytheme.theme"; "alien" = "oem.theme" }

# Identify paths to user themes.
$userThemes = " C:\Users\yoda\AppData\Local\Microsoft\Windows\"

# Get name of theme file, based on theme provided
$themeFile = $knownThemes["$theme"]

# Build path to theme and set registry.
$newThemePath = "$userThemes$themeFile"
$regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\"
Set-ItemProperty -path $regPath -name CurrentTheme -value $newThemePath

# Update system with this info...this isn't working!
rundll32.exe user32.dll, UpdatePerUserSystemParameters
Грег Макгаффи
источник

Ответы:

2

Взгляните на вопрос переполнения стека. Как программно изменить текущую тему Windows? иметь дело с той же проблемой. Похоже, что большинство комментаторов думают, что вам вообще не следует этого делать (вы можете игнорировать их). Другие предложения можно легко превратить в скрипт PowerShell - просто вызовите соответствующие функции API.

Путешествующий техник
источник
1

Я решил проблему с этим кодом (проверено в Windows 7 64bit)

# definition de la fonction native Windows permettant le test d'activation d'Aero
$def = @"

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern bool DwmIsCompositionEnabled();

"@
# chargement de la fonction native dans un namespace personnel
Add-Type -Namespace MaifCode -Name Aero -MemberDefinition $def


# fonction qui check si Aero est desactive ou non
function Check-Is-Aero{
    [CmdletBinding()]
    param()
    Write-Verbose "[$([DateTime]::Now)] ==> Test de la presence du mode Aero pour la session utilisateur $env:USERNAME"
    if([MaifCode.Aero]::DwmIsCompositionEnabled()){
        Write-Verbose "[$([DateTime]::Now)] ==> Aero actif pour la session utilisateur $env:USERNAME"
        return $true
    }else{
        Write-Verbose "[$([DateTime]::Now)] ==> Aero inactif pour la session utilisateur $env:USERNAME"
        return $false
    }
}

# fonction qui test si Aero est actif et le desactive dans ce cas
function Disable-Aero{
    [CmdletBinding()]
    param()
    # test si aero actif
    If(Check-Is-Aero) {
        Write-Verbose "[$([DateTime]::Now)] ==> Tentative de desactivation du mode Aero pour la session utilisateur $env:USERNAME"
        # desactivation du mode aero en passant sur le them par defaut
        try{
            Start-Process -Wait -FilePath "rundll32.exe" -ArgumentList "$env:SystemRoot\system32\shell32.dll,Control_RunDLL $env:SystemRoot\system32\desk.cpl desk,@Themes /Action:OpenTheme /file:""C:\Windows\Resources\Ease of Access Themes\basic.theme"""
        }
        catch [exception]
        {
            # si erreur alors on sort et on affiche le message d'erreur
            Write-Error "Erreur dans l'execution de la desactivation du mode Aero : $error"
            exit -1
        }
        Write-Verbose "[$([DateTime]::Now)] ==> Desactivation du mode Aero pour la session utilisateur $env:USERNAME terminee"
    }else{
        Write-Verbose "[$([DateTime]::Now)] ==> sortie du script sans action"
    }
}

# execution du code de desactivation
Disable-Aero -Verbose
# on sort
exit 0
никола
источник