`
xpenxpen
  • 浏览: 701926 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用Java更换Windows桌面壁纸

jna 
阅读更多
2015/01/23晚22:00更新
不好意思,之前程序没有在中文操作系统下测试过,居然乱码,我修正了程序重新上传了。
WebUtils.java读json的那段改为UTF8编码了,另外javac编译时也改为UTF8。

BufferedReader reader = new BufferedReader(
                      new InputStreamReader(url.openStream(), "UTF-8"));

编译双击compile.bat即可。
运行执行ChangeWall.bat即可。

1.简介
这个Java程序可以用来更换Windows的桌面壁纸。
出处JavaArt Chapter 0.5.Automatic Wallpapering。原作者为泰国的Dr. Andrew Davison。
我将代码稍事修改,原文用谷歌搜索图片,因为谷歌地址已经不工作了,我将搜索引擎改为了百度。可在文末下载。

以下环境测试通过:
Windows7 64bit
JDK1.7

理论上32位Windows 7也可以。Windows XP的话需要稍作修改(见后文)。

2.实现思路步骤

如图所示

2.1 先从一个自定义文件中读取要搜索的壁纸的关键字,这步我省略了,改为写死在代码里
String urlStr = "http://image.baidu.com/channel/listjson?pn=0&rn=30&tag1=%E5%A3%81%E7%BA%B8&tag2=%E9%A3%8E%E6%99%AF&ie=utf8";

这里的URL被编码了,如果你把它输入到浏览器中其实就是以下这个地址
http://image.baidu.com/channel/listjson?pn=0&rn=30&tag1=壁纸&tag2=风景&ie=utf8

地址是如何找到的呢,是通过百度图片搜索试验出来的,可以参考
百度图片api

2.2 通过百度搜索图片(HTTP GET),得到json格式的返回结果,将URL解析出来。
解析json用了org.json这个jar包,至于json的含义(比如图片的url在哪里),就需要人工事先分析了。
以下是一部分运行结果:
Contacting "http://image.baidu.com/channel/listjson?pn=0&rn=30&tag1=%E5%A3%81%E7%BA%B8&tag2=%E9%A3%8E%E6%99%AF&ie=utf8"

Total no. of possible results: 30000

1. Content: 唯美清新花草特写高清桌面壁纸第9张
       URL: http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1306/21/c0/22385822_1371807526556.jpg

2. Content: 挪威自然美景高清壁纸第8张
       URL: http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1412/11/c1/530645_1418308843368.jpg


2.3 随机选择下载一张图片

2.4 放大,裁剪图片(使用Java 2D),以适应桌面分辨率,将修改后的图片保存为wallpaper.jpg到程序目录

2.5 更新桌面(使用jna)
修改壁纸可通过改windows注册表实现
    Advapi32Util.registrySetStringValue(WinReg.HKEY_CURRENT_USER, 
                                  "Control Panel\\Desktop", "Wallpaper", fullFnm);
    //WallpaperStyle = 10 (Fill), 6 (Fit), 2 (Stretch), 0 (Tile), 0 (Center)
    //For windows XP, change to 0
    Advapi32Util.registrySetStringValue(WinReg.HKEY_CURRENT_USER, 
                                  "Control Panel\\Desktop", "WallpaperStyle", "10"); //fill
    Advapi32Util.registrySetStringValue(WinReg.HKEY_CURRENT_USER, 
                                  "Control Panel\\Desktop", "TileWallpaper", "0");   // no tiling


然后要调用User32.dll里的SystemParametersInfoA函数刷新桌面,并将更改通知给其他程序。
      // refresh the desktop using User32.SystemParametersInfo(), so avoiding an OS reboot
      int SPI_SETDESKWALLPAPER = 0x14;
      int SPIF_UPDATEINIFILE = 0x01;
      int SPIF_SENDWININICHANGE = 0x02;

      boolean result = MyUser32.INSTANCE.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, 
                                fullFnm, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE );


最后这部分是一个很好的idea,通过jna就可以直接调用windows操作系统上dll的api了。这样java真是无所不能了。

3. 关于Windows XP修改点
如果很不幸你的OS是Windows XP,那需要修改如下:
首先XP系统只能用bmp壁纸,请将jpg改为bmp
  //Change to bmp format if OS version < Windows 7
  private static final String WALL_FORMAT = "jpg";
  private static final String WALL_FNM = "wallpaper.jpg";    // the name of the wallpaper file


然后说下壁纸的设置风格,有以下几种
WallpaperStyle = 10 (Fill), 6 (Fit), 2 (Stretch), 0 (Tile), 0 (Center)
程序里用的是10 (Fill),但XP不支持,只能设为0

4. 定时更换壁纸
如果要定时更换壁纸,可以通过windows的schtasks命令加一个任务计划,执行bat脚本启动java程序,或者使用第三方软件如z-cron

5. DLL查看器
如何查看某个dll里有哪些函数呢,可通过这个工具
dll export viewer

如下图可看到User32.dll里有个SystemParametersInfoA函数

  • 大小: 58.6 KB
  • 大小: 83 KB
2
0
分享到:
评论
2 楼 Raina 2017-06-16  
运行不了呢……提示错误无法加载主类Baiduwallpaper,但是文件就在文件夹里啊……
1 楼 helloaiy 2016-08-24  
您好前辈,我按照您的代码,执行也成功了,但是最终SystemParametersInfoA 返回false,我不知道是哪里的问题。再次启动后,桌面是黑色背景,而不是我设置的图片。请教一下,从哪里能看到 返回false的原因

相关推荐

Global site tag (gtag.js) - Google Analytics