如何使用Java获取当前活动桌面壁纸的路径

3

我希望对正在使用的桌面壁纸进行更改,例如添加水印。

为此,我需要获取正在使用的桌面壁纸的路径。添加水印我可以做到。

这可以使用JNA库完成,但我无法访问文件路径。


你能否访问注册表中的 HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperOriginalWallpaperConvertedWallpaper 条目?请参见链接 - ee.
3个回答

3

获取当前桌面壁纸的方式可能因操作系统而异,对于Windows 7,可以从以下注册表路径获取:

HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper

要读取注册表路径,您可以使用以下问题中描述的方法:

使用Java读写Windows注册表


这已经在上面的评论中提到了(除非您添加了有关如何读取/写入Windows注册表的SO链接)。 - Buhake Sindi

2

正如Low Flying Pelicanee所说的,

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');

0

使用JNA库

implementation("net.java.dev.jna:jna-platform:5.12.1")

我能够像这样获取当前壁纸路径(在 Windows 11 上测试通过):
Java:
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
    )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接