我希望对正在使用的桌面壁纸进行更改,例如添加水印。
为此,我需要获取正在使用的桌面壁纸的路径。添加水印我可以做到。
这可以使用JNA库完成,但我无法访问文件路径。
我希望对正在使用的桌面壁纸进行更改,例如添加水印。
为此,我需要获取正在使用的桌面壁纸的路径。添加水印我可以做到。
这可以使用JNA库完成,但我无法访问文件路径。
获取当前桌面壁纸的方式可能因操作系统而异,对于Windows 7,可以从以下注册表路径获取:
HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper
要读取注册表路径,您可以使用以下问题中描述的方法:
正如Low Flying Pelican和ee所说的,
HKEY_CURRENT_USER\Control Panel\Desktop
该文本包含关键词壁纸,它指向壁纸。对于命令提示符,您可以使用
reg query "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper
要获取位置信息,或者使用此选项以获得本机Java支持:
Runtime.getRuntime().exec('reg query "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper');
使用JNA库:
implementation("net.java.dev.jna:jna-platform:5.12.1")
import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.WinReg.HKEYByReference;
public class Main {
public static final String REGISTRY_PATH = "Control Panel\\Desktop";
public static final String REGISTRY_Key = "WallPaper";
public static void main(String[] args) {
var hKey = new HKEYByReference();
var registryAccessResult = openRegistryKey(hKey);
validate(registryAccessResult);
var wallpaperPath = getWallpaperPath();
System.out.println(wallpaperPath);
}
public static int openRegistryKey(HKEYByReference hKey) {
return Advapi32.INSTANCE.RegOpenKeyEx(
WinReg.HKEY_CURRENT_USER,
REGISTRY_PATH,
0,
WinNT.KEY_READ,
hKey
);
}
public static void validate(int registryAccessResult) {
if (registryAccessResult != W32Errors.ERROR_SUCCESS) {
throw new Win32Exception(registryAccessResult);
}
}
public static String getWallpaperPath() {
return Advapi32Util.registryGetStringValue(
WinReg.HKEY_CURRENT_USER,
REGISTRY_PATH,
REGISTRY_Key
);
}
}
Kotlin:
const val REGISTRY_PATH = "Control Panel\\Desktop"
const val REGISTRY_Key = "WallPaper"
fun main() {
val hKey = HKEYByReference()
openRegistryKey(hKey).validate()
val wallpaperPath = getWallpaperPath()
println(wallpaperPath)
}
fun openRegistryKey(hKey: HKEYByReference) =
Advapi32.INSTANCE.RegOpenKeyEx(
WinReg.HKEY_CURRENT_USER,
REGISTRY_PATH,
0,
WinNT.KEY_READ,
hKey
)
fun RegistryAccessResult.validate() =
takeIf { it == W32Errors.ERROR_SUCCESS }
?: throw Win32Exception(this)
fun getWallpaperPath(): String =
Advapi32Util.registryGetStringValue(
WinReg.HKEY_CURRENT_USER,
REGISTRY_PATH,
REGISTRY_Key
)
你还可以监听壁纸变化并获取其新路径:
waitForWallpaperChange(hKey).validate() // Waits until wallpaper is changed
val newWallpaper = getWallpaperPath()
fun waitForWallpaperChange(hKey: HKEYByReference) =
Advapi32.INSTANCE.RegNotifyChangeKeyValue(
hKey.value,
false,
WinNT.REG_NOTIFY_CHANGE_LAST_SET,
null,
false
)
HKEY_CURRENT_USER\Control Panel\Desktop\
:Wallpaper
、OriginalWallpaper
或ConvertedWallpaper
条目?请参见链接 - ee.