java一键换壁纸_Java 版下载必应每日壁纸并自动设置 Windows 系统桌面(改编自 C# 版)...
哈哈,好久沒有寫博客了,已經荒廢了,前幾天在某 IT 網站看到一個用 C# 寫的設置必應每日壁紙為 Windows 系統桌面,看了看源碼是通過調用 User32.dll 進行設置的,剛剛最近做的項目更調用 dll 有關,感覺用 Java 也能做出來,果斷用 Java 也寫了一個,不過只實現了簡單的下載保存圖片并設置圖片為桌面壁紙的功能,沒有做到和 C# 版的那么強大,比較雞肋,僅用于本人無聊時練練手,分享出來,有興趣的可以到 GitHub 查看源碼。
說明
參數 format 可選值:xml / js (json)
一、C# 原版(可以選擇尺寸和樣式)
二、本人改編的 Java 版(默認 1080P 及填充)
1. 開始歡迎界面:
2. 主界面,自動下載并設置壁紙:
2017-09-07 今日白露
2017-09-04
2017-09-03
3. Alt + F12 打開/關閉信息控制臺:
2017-09-04
2017-09-03
4. Ctrl + W 關閉程序
5. 特別說明:
雖然程序使用 Java 開發的,理論上也可以在 Mac 和 Linux 上運行,但是由于需要調用系統層的東西,在 Mac 及 Linux (在網上查到 Linux 可以通過執行終端命令來設置壁紙,未在程序中實現)運行并不能設置壁紙,只能夠下載并保存必應每日壁紙圖片:
6. 2018-01-26 更新:添加快捷方式參數
通過在快捷方式后添加 -hide 或 -h 打開程序提示設置壁紙完成后直接關閉程序,不顯示主程序窗口:
三、原 C# 版核心代碼:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace BingWallpaperTest
{
class Program
{
static void Main(string[] args)
{
setWallpaper();
}
/**
* 獲取壁紙網絡地址
*/
public static string getURL()
{
string InfoUrl = "http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(InfoUrl);
request.Method = "GET"; request.ContentType = "text/html;charset=UTF-8";
string xmlDoc;
// 使用using自動注銷HttpWebResponse
using (HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse())
{
Stream stream = webResponse.GetResponseStream();
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
xmlDoc = reader.ReadToEnd();
}
}
// 使用正則表達式解析標簽(字符串),當然你也可以使用XmlDocument類或XDocument類
Regex regex = new Regex("(?.*?)", RegexOptions.IgnoreCase);
MatchCollection collection = regex.Matches(xmlDoc);
// 取得匹配項列表
string ImageUrl = "http://www.bing.com" + collection[0].Groups["MyUrl"].Value;
if (true)
{
ImageUrl = ImageUrl.Replace("1366x768", "1920x1080");
}
return ImageUrl;
}
public static void setWallpaper()
{
string ImageSavePath = @"D:\Program Files\BingWallpaper";
// 設置墻紙
Bitmap bmpWallpaper;
WebRequest webreq = WebRequest.Create(getURL());
// Console.WriteLine(getURL());
// Console.ReadLine();
WebResponse webres = webreq.GetResponse();
using (Stream stream = webres.GetResponseStream())
{
bmpWallpaper = (Bitmap)Image.FromStream(stream);
// stream.Close();
if (!Directory.Exists(ImageSavePath))
{
Directory.CreateDirectory(ImageSavePath);
}
// 設置文件名為例:bing2017816.jpg
bmpWallpaper.Save(ImageSavePath + "\\bing" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + ".jpg", ImageFormat.Jpeg); //圖片保存路徑為相對路徑,保存在程序的目錄下
}
// 保存圖片代碼到此為止,下面就是
string strSavePath = ImageSavePath + "\\bing" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + ".jpg";
setWallpaperApi(strSavePath);
}
// 利用系統的用戶接口設置壁紙
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
public static extern int SystemParametersInfo(
int uAction,
int uParam,
string lpvParam,
int fuWinIni
);
public static void setWallpaperApi(string strSavePath)
{
SystemParametersInfo(20, 1, strSavePath, 1);
}
}
}
四、Java 版核心代碼(dom4j.jar / jna.jar + jna-platform.jar):
本來是想用 jcom.jar 去調用 dll 來設置壁紙的,奈何沒弄出來,反而知道了還有一個叫 jna 的東西...
package cn.zixizixi.wallpaper;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;
import cn.zixizixi.wallpaper.util.ConsoleDialog;
import cn.zixizixi.wallpaper.util.StrUtils;
/**
* 下載并設置必應每日桌面壁紙
* @author Tanken·L
* @version 20170901
*/
public class SetBingImage {
private static boolean debug = true;
/**
* 獲取必應每日壁紙圖片網絡路徑
* @param custom
* @return
*/
public static String getUrl(String custom) {
String infoUrl = "http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1";
URL url = null;
URLConnection urlConn = null;
try {
url = new URL(infoUrl);
urlConn = url.openConnection();
urlConn.setConnectTimeout(3000);
BufferedReader bufRead = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), "UTF-8"));
StringBuilder strBud = new StringBuilder();
String line = null;
while ((line = bufRead.readLine()) != null) {
strBud.append(line);
}
Element imgEle = DocumentHelper.parseText(strBud.toString()).getRootElement();
infoUrl = "http://cn.bing.com" + imgEle.element("image").elementText("url");
if (custom != null && custom.trim() != "") {
infoUrl = infoUrl.replace("1366x768", custom);
}
return infoUrl;
} catch (SocketTimeoutException e) {
// "[TOE]請求接口連接超時:" + e.getMessage()
} catch (IOException e) {
// "[IOE]請求接口加載出錯:" + e.getMessage()
} catch (DocumentException e) {
// "[DOE]請求接口解析出錯:" + e.getMessage()
} finally {
url = null;
urlConn = null;
}
return null;
}
/**
* 保存網絡圖片到本地
* @param size
* @return
*/
public static String downloadImage(String imageUrl) {
String fileSepar = StrUtils.F_SEPAR;
String savePath = StrUtils.U_HOME + fileSepar + "Pictures" + fileSepar + "BingWallpaper";
try {
URL url = new URL(imageUrl);
URLConnection urlConn = url.openConnection();
urlConn.setConnectTimeout(5000);
File fileDir = new File(savePath);
if(!fileDir.exists()){
fileDir.mkdirs();
}
InputStream is = urlConn.getInputStream();
byte[] bs = new byte[1024];
int len;
String fileName = imageUrl.substring(imageUrl.indexOf("_ZH-CN") + 6, imageUrl.length());
String filePath = fileDir.getPath() + fileSepar + StrUtils.nowStr("yyyyMMdd_") + fileName;
OutputStream os = new FileOutputStream(filePath);
while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len);
}
os.close();
is.close();
return filePath;
} catch (IOException e) {
// "下載圖片加載出錯:" + e.getMessage();
} finally {
fileSepar = null;
savePath = null;
imageUrl = null;
}
return null;
}
public static boolean setWinWallpaper(String filePath) {
boolean flag = false;
if (StrUtils.isEmpty(filePath)) {
// 圖片路徑為空,無法設置壁紙!
} else {
if (Platform.isWindows()) {
// 調用 User32 設置桌面背景
flag = User32.INSTANCE.SystemParametersInfoA(20, 1, filePath, 1);
} else {
// TODO Other OS 目前僅能設置 Windows 系統的壁紙,其他系統只能下載保存壁紙圖片!
}
}
return flag;
}
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
void printf(String format, Object... args);
}
public interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("User32", User32.class);
/**
* 查詢/設置系統級參數
* @param uAction 要設置的參數:
* 6(設置視窗的大小) / 17(開關屏保程序) / 13, 24(改變桌面圖標水平和垂直間距) / 15(設置屏保等待時間) /
* 20(設置桌面背景墻紙) / 93(開關鼠標軌跡) / 97 (開關Ctrl+Alt+Del窗口)
* @param uParam 參數
* @param lpvParam 參數
* @param fuWinIni
* @return
*/
public boolean SystemParametersInfoA(int uAction, int uParam, String lpvParam, int fuWinIni);
}
}
總結
以上是生活随笔為你收集整理的java一键换壁纸_Java 版下载必应每日壁纸并自动设置 Windows 系统桌面(改编自 C# 版)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 运行elf64,Elf64
- 下一篇: 多方安全计算MPC