[英]Change Windows 7 Wallpaper Using Java
我在这里找到了这段代码
import java.util.HashMap;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.UINT_PTR;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIFunctionMapper;
import com.sun.jna.win32.W32APITypeMapper;
public class test {
public static void main(String[] args) {
//supply your own path instead of using this one
String png = "C:\\Overwatch\\690653.png";
String jpg = "C:\\Witcher\\616521.jpg";
String path = png;
System.out.println(SPI.INSTANCE.SystemParametersInfo(
new UINT_PTR(SPI.SPI_SETDESKWALLPAPER),
new UINT_PTR(0),
path,
new UINT_PTR(SPI.SPIF_UPDATEINIFILE | SPI.SPIF_SENDWININICHANGE)));
}
public interface SPI extends StdCallLibrary {
//from MSDN article
long SPI_SETDESKWALLPAPER = 20;
long SPIF_UPDATEINIFILE = 0x01;
long SPIF_SENDWININICHANGE = 0x02;
SPI INSTANCE = (SPI) Native.loadLibrary("user32", SPI.class, new HashMap<Object, Object>() {
{
put(OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE);
put(OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.UNICODE);
}
});
boolean SystemParametersInfo(
UINT_PTR uiAction,
UINT_PTR uiParam,
String pvParam,
UINT_PTR fWinIni
);
}
}
但它似乎不适用于png。 我只能使用它来将墙纸设置为jpg。 我一直无法弄清楚UINT_PTR在做什么,我想知道是否需要根据图像类型更改其中之一。
我尝试更改为UINT并使用LPWSTR,但它仍然仅更改为jpg。 这就是我目前拥有的...
public static void main(String[] args){
String[] paths = {
"C:\\Overwatch\\690653.png",
"C:\\Witcher\\616521.jpg",
"C:\\wallpapers\\mario.gif",
"C:\\wallpapers\\Mystic_Tree.wmv"
};
for(String path : paths)
System.out.println(change(path) ? "Worked!\n" + path : "Didn't work :(\n" + path);
}
public static interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class, W32APIOptions.UNICODE_OPTIONS);
boolean SystemParametersInfo (UINT uiAction, UINT uint, Pointer imagePath, UINT fWinIni);
}
public static boolean change(String path){
Pointer imagePath = new LPWSTR(path).getPointer();
UINT uiAction = new UINT(0x0014l);
UINT userPolicy = new UINT(0l);
long updateIni = 0x01l;
long sendChange = 0x02l;
return User32.INSTANCE.SystemParametersInfo(uiAction, userPolicy, imagePath , new UINT(updateIni | sendChange));
}
JNA代码存在一些问题,以尝试回答有关应使用哪些设置的问题。
首先,请参考SystemParametersInfo的方法签名 。 这应该有助于回答您的许多问题。
请注意,三个参数是UINT
(32位整数)。 您应该使用JNA的UINT
(由long
支撑的32位),而不是UINT_PTR
(可以是32位或64位)(无论Pointer.SIZE评估UINT_PTR
)。 尽管在这种特殊情况下,您可以只传递普通的Java int
值并获得所需的结果,因为它们都不大到足以关心符号位。
(此外,为什么不使用十进制20而不是十六进制0x0014?不会破坏内容,但是在进行按位数学运算时,读者可以更清楚地将代码保留为十六进制。)
请注意,该字符串的参数实际上是一个指针,尽管我链接的文档不清楚,但深入了解它似乎表明C在这里期望指向宽字符串类型的指针LPWSTR
。 您应该使用类似:
WTypes.LPWSTR png = new WTypes.LPWSTR("C:\\Overwatch\\690653.png");
所有这些...
从其他地方看来,Windows 7在墙纸和图像压缩方面存在一些缺陷,这是Windows 7的错误/功能/设计,可能与您的代码无关。 在这些当中:
这个问题的答案之一(可能是您的原始资料?)指出“ Windows 7不喜欢将jpeg图像设置为墙纸。您需要先将图像文件转换为Bitmap,然后将bmp图像设置为背景”。
微软网站上的该线程讨论了压缩问题,并建议“将图像另存为位图,也称为.bmp,然后重命名为.jpg,因此文件本身实际上是位图,但它以jpeg的形式传递给操作系统,因此认为不必压缩它”
我建议以.bmp开头并将其保存为所有不同的扩展名,以排除任何特定于扩展名的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.