繁体   English   中英

使用Java更改Windows 7墙纸

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM