使用 java 更换墙纸

Change wallpaper using java

我在互联网上找到了这段代码,用于使用 JNA 库更改 windows 墙纸,它可以正常工作,但只能用于 .jar 程序之外的图像(这里是代码)

public class Wallpaper {

public Wallpaper() {
    User32.INSTANCE.SystemParametersInfo(0x0014, 0, "C:\Users\Public\Pictures\Sample Pictures\bg.jpg", 1);
}
public static interface User32 extends Library {

    User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class, W32APIOptions.DEFAULT_OPTIONS);

    boolean SystemParametersInfo(int one, int two, String s, int three);
}

}

有没有办法从资源中获取文件?当我用这个

替换文件路径时它不起作用
getClass().getResource("bg.jpg").getPath()

getResource 从你的 class 文件所在的任何地方检索资源,这可能是一个网络,即时生成,或者,很可能是从一个 jar 文件中,并且 那些不是文件。您正在调用的 windows API 需要一个文件。

因此,答案是:你想要的,是不可能的。

但你可以解决它。

您可以将资源作为流获取,在某处打开文件,将字节传输过来('copying' 将资源传输到文件),然后提供文件。类似于:

Path p = Paths.get(System.getProperty("user.home"), "backgrounds", "bg.jpg");
Files.createDirectories(p.getParent());
try (InputStream in = Wallpaper.class.getResourceAsStream("bg.jpg");
  OutputStream out = Files.newOutputStream(p)) {

    in.transferTo(out);
}
User32.INSTANCE.SystemParametersInfo(0x0014, 0, p.getAbsolutePath().toString(), 1);

注意:getResource 的正确用法不是通过 getClass(),而是:Wallpaper.class.getResource。如果 subclassing.

getClass() 中断