Java 切换win10壁纸

选择壁纸图片

以图片或幻灯片指定一张图片或文件夹,具体操作(省略)

使用JAVA从网上下载图片

注 : 这里采用了360 图库 api

import cn.hutool.json.JSON;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Random;

public class UrlUtil {
	//main
    public static void main(String[] args){
        try {
        //获取壁纸URL string
            String imageUrlFor360 = UrlUtil.getImageUrlFor360(5, 0, 200);
            //保存替换壁纸
            UrlUtil.saveImagePNG(imageUrlFor360,"wallpaper");

//删除缓存壁纸目录
    		UrlUtil.deleteImage("C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Themes/CachedFiles");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 从360API获取图片地址
     * @param cid    1:每日精选  5:游戏  6:美女 9:风景
     *               10:视觉创意 11:明星影视 12:汽车 14:萌宠动物
     *               15:小清新 16:体育 22:军事 26:动漫卡通 30:情感 35:文字
     * @param start  起始索引
     * @param count  总共取值
     * @return
     * @throws IOException
     */
    public static String getImageUrlFor360(Integer cid,Integer start,Integer count) throws IOException {
        URL url = new URL(String.format("http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByCategory&cid=%d&start=%d&count=%d&from=360chrome",cid,start,count));
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setUseCaches(false);
        conn.setConnectTimeout(5000); // 请求超时5秒
        // 设置HTTP头:
        conn.setRequestProperty("Accept", "*/*");
        conn.setRequestProperty("User-Agent", "Mozilla/5.0 (compatible; MSIE 11; Windows NT 5.1)");
        // 判断HTTP响应是否200:
        if (conn.getResponseCode() != 200) {
            throw new RuntimeException("bad response");
        }
        // 获取响应内容:
        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        StringBuffer sbf = new StringBuffer();
        String str = "";
        while ((str = br.readLine()) != null){
            sbf.append(str);
        }
        JSON parse = JSONUtil.parse(sbf.toString());
        Object data =parse.getByPath("data");
        //返回的所有图片数据,若需要全部下载,在此进行遍历即可
        JSONArray dataArr = JSONUtil.parseArray(data);
        int size = dataArr.size();
        //随机抽选
        Random random = new Random();
        int i = random.nextInt(size);
        JSONObject o = (JSONObject)dataArr.get(i);
        conn.disconnect();
        //获取壁纸图片,还有其他格式,查看json尝试
        return o.get("url_thumb",String.class);
    }
	//保存JPG格式
    public static void saveImageJPG(String imgUrl,String fileName) throws IOException {
        saveImage(imgUrl,fileName,"jpg");
    }
    //保存PNG格式
    public static void saveImagePNG(String imgUrl,String fileName) throws IOException {
        saveImage(imgUrl,fileName,"png");
    }
    /**
     * 根据网络图片地址 保存至本地
     * @param imgUrl
     * @param fileName
     * @param type
     * @throws IOException
     */
    public static void saveImage(String imgUrl,String fileName,String type) throws IOException {
        URL url = new URL(imgUrl);
        BufferedImage read = ImageIO.read(url);
        FileOutputStream fileOutputStream = new FileOutputStream(String.format("你的图片目录/%s.%s",fileName,type));
        ImageIO.write(read,type,fileOutputStream);
        fileOutputStream.close();
    }

/**
* 删除壁纸目录下图片
*/
public static void deleteImage(String imgUrl){
        File file = new File(imgUrl);
        if(file.exists() && file.isDirectory()){
            File[] files = file.listFiles();
            for (File f:files) {
                f.deleteOnExit();
            }
            file.delete();
        }
    }
}

JSON采用了hutool,也可以用coogle和alibaba的,逻辑都是一致的

运行后发现图片已经下载下来却没有切换壁纸,是因为windows中注册表信息没有改变,java没有直接操作系统注册表的操作,于是我们使用cmd命令进行操作。

首先先将程序打成可执行jar包

修改壁纸注册表

@echo off
:: 开始获取管理员权限,要使用管理员账号登录
setlocal
set uac=~uac_permission_tmp_%random%
md "%SystemRoot%\system32\%uac%" 2>nul
if %errorlevel%==0 ( rd "%SystemRoot%\system32\%uac%" >nul 2>nul ) else (
    echo set uac = CreateObject^("Shell.Application"^)>"%temp%\%uac%.vbs"
    echo uac.ShellExecute "%~s0","","","runas",1 >>"%temp%\%uac%.vbs"
    echo WScript.Quit >>"%temp%\%uac%.vbs"
    "%temp%\%uac%.vbs" /f
    del /f /q "%temp%\%uac%.vbs" & exit )
endlocal
::  切换至jar包路径,运行jar下载 替换壁纸图片
D:
cd 你的路径
java -jar jar包名称
::  修改注册表信息, 有时候修改频繁 壁纸依旧切换不了
reg add "hkcu\control panel\desktop" /v wallpaper /d "壁纸全路径" /f
RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters 
echo. & pause  

注:注意替换地址

  • 如果使用幻灯片,就可以自然等切换时间进行更换,如果是想直接替换,就采用修改注册表的方式
  • 我这里用的JDK-8 所以没有使用httpclient,也不知道高版本是否有自带的JSON工具,大家可以自行尝试体会
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值