使用 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() 中断
我在互联网上找到了这段代码,用于使用 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.