我的正确代码就是这个
Add-Type @"
using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace Wallpaper
{
public enum Style : int
{
Tile, Center, Stretch, NoChange
}
public class Setter {
public const int SetDesktopWallpaper = 20;
public const int UpdateIniFile = 0x01;
public const int SendWinIniChange = 0x02;
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int SystemParametersInfo (int uAction, int uParam, string lpvParam, int fuWinIni);
public static void SetWallpaper ( string path, Wallpaper.Style style ) {
SystemParametersInfo( SetDesktopWallpaper, 0, path, UpdateIniFile | SendWinIniChange );
RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true);
switch( style )
{
case Style.Stretch :
key.SetValue(@"WallpaperStyle", "2") ;
key.SetValue(@"TileWallpaper", "0") ;
break;
case Style.Center :
key.SetValue(@"WallpaperStyle", "1") ;
key.SetValue(@"TileWallpaper", "0") ;
break;
case Style.Tile :
key.SetValue(@"WallpaperStyle", "1") ;
key.SetValue(@"TileWallpaper", "1") ;
break;
case Style.NoChange :
break;
}
key.Close();
}
}
}
"@
[Wallpaper.Setter]::SetWallpaper( 'C:\Users\God\Desktop\Test\God.bmp' , 0 )
好的,脚本带有God.bmp,它总是在同一个中 目录(桌面上的文件夹测试),我试图用“。\ God.bmp”替换路径“C:\ Users \ God \ Desktop \ Test \ God.bmp”哪个应该可以工作但是它似乎工作我似乎工作我尝试了“./God.bmp”,但背景变成了黑色而不是上帝的画面。所以我怎么能让它正常工作,因为通常。\使它使用当前路径,据我所知
答案 0 :(得分:0)
Windows可能无法处理注册表中壁纸的相对路径。如果您想在代码中使用相对路径,则必须在写入注册表之前将它们扩展为完整路径:
$FullPath = Join-Path -Path (Get-Location -PSProvider FileSystem).Path -ChildPath 'God.bmp'
[Wallpaper.Setter]::SetWallpaper($FullPath , 0)
答案 1 :(得分:0)
PowerShell将尝试查找.\God.bmp
相对于调用者的,而不是文件系统中存在执行脚本的位置。
试试这个简单的例子:
# C:\scripts\relativepath.ps1
[System.IO.Path]::GetFullPath(".\god.bmp")
如果您打开提示并cd
发送到C:\scripts
,则按预期工作:
PS C:\scripts> .\relativepath.ps1
C:\scripts\god.bmp
但是如果你换到另一个目录:
PS C:\somewhere\else> C:\scripts\relativepath.ps1
C:\somewhere\else\god.bmp
如果您想要相对于执行脚本所在的的完整路径,请使用$PSScriptRoot
自动变量:
$WallPaperPath = Join-Path -Path $PSScriptRoot -ChildPath "god.bmp"