java设置桌面,使用Java在Windows 7上设置墙纸

本文介绍了一个使用Java编写的壁纸更新程序,该程序能够从NASA的每日天文图片中获取图像,并根据屏幕尺寸调整图像大小,最后将其设为桌面壁纸。文章讨论了如何处理不同屏幕宽高比的图片,以及如何通过修改注册表来改变壁纸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我一直在尝试一个小程序,将桌面图像设置为当前的“每日天文图片”。我一直在使用JNA建议从类似的问题()设置墙纸。但是,我的代码无法正常工作。我不确定出什么问题-

我对JNA的经验很少。这是代码。请忽略完全误导的类名-我从另一个项目开始着手。无效的部分是墙纸的最终设置-没有错误提示,它什么也没做。图像保存良好。

编辑-我决定制作一个批处理文件来设置注册表项并运行它。批处理文件有时可以工作,然后在其他时间拒绝工作。到目前为止,这只是部分成功!该程序现在是:

编辑2-我从中导入了墙纸代码,可以用Java /

Groovy以编程方式更改Windows桌面墙纸吗?一旦我记得关闭输出文件(doh!),它就可以正常工作。

import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.Toolkit;

import java.awt.image.BufferedImage;

import java.awt.image.CropImageFilter;

import java.awt.image.FilteredImageSource;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.HashMap;

import javax.imageio.ImageIO;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.text.BadLocationException;

import javax.swing.text.MutableAttributeSet;

import javax.swing.text.html.HTML;

import javax.swing.text.html.HTML.Tag;

import javax.swing.text.html.HTMLEditorKit;

import javax.swing.text.html.HTMLEditorKit.ParserCallback;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.CharacterData;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import java.io.File;

import java.util.Iterator;

import javax.imageio.*;

import javax.imageio.stream.*;

public class RSSReader {

private class HTMLParse extends HTMLEditorKit

{

/**

* Call to obtain a HTMLEditorKit.Parser object.

*

* @return A new HTMLEditorKit.Parser object.

*/

public HTMLEditorKit.Parser getParser()

{

return super.getParser();

}

}

private class HREFCallback extends ParserCallback

{

private String base;

public HREFCallback(String base)

{

this.base = base;

}

@Override

public void handleStartTag(Tag t,

MutableAttributeSet a,

int pos)

{

if (t == HTML.Tag.A)

{

String href = (String)(a.getAttribute(HTML.Attribute.HREF));

if (href.endsWith("jpg") && href.startsWith("image"))

{

URL u_img;

try

{

u_img = new URL(base + href);

System.out.println(u_img.toString());

Image img = ImageIO.read(u_img);

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

double aspectScreen = dim.getWidth() / dim.getHeight();

double aspectImage = img.getWidth(null) / img.getHeight(null);

System.out.println(Double.toString(aspectScreen)

+ " " + Double.toString(aspectImage));

if (aspectScreen / aspectImage > 1.1 || aspectScreen / aspectImage < 0.9)

{

int x = 0;

int y = 0;

int w = (int)img.getWidth(null);

int h = (int)img.getHeight(null);

if (aspectScreen > aspectImage)

{

// Image needs to be letterboxed

double newHeight = img.getWidth(null) / aspectScreen;

y = (int)((img.getHeight(null) - newHeight) / 2);

h = (int)newHeight;

}

else

{

double newWidth = img.getHeight(null) / aspectScreen;

x = (int)(img.getWidth(null) - newWidth / 2);

w = (int)newWidth;

}

img = Toolkit.getDefaultToolkit().createImage((new FilteredImageSource(img.getSource(),

new CropImageFilter(x,y,w,h))));

}

Image scaled = img.getScaledInstance(dim.width, dim.height, Image.SCALE_DEFAULT);

String l_appdata = System.getenv("APPDATA");

System.out.println(l_appdata);

if (!l_appdata.equals(""))

{

try {

BufferedImage bufImage =

new BufferedImage(scaled.getWidth(null), scaled.getHeight(null),BufferedImage.TYPE_INT_RGB);

Graphics2D bufImageGraphics = bufImage.createGraphics();

bufImageGraphics.drawImage(scaled, 0, 0, null);

String dirname = l_appdata + "\\" + "APOD Wallpaper";

(new File(dirname)).mkdir();

String fname = dirname + "\\" + "apod_wallpaper1.jpg";

File outputfile = new File(fname);

Iterator iter = ImageIO.getImageWritersByFormatName("jpeg");

ImageWriter writer = (ImageWriter)iter.next();

// instantiate an ImageWriteParam object with default compression options

ImageWriteParam iwp = writer.getDefaultWriteParam();

iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);

iwp.setCompressionQuality(1); // an integer between 0 and 1

// 1 specifies minimum compression and maximum quality

File file = new File(fname);

FileImageOutputStream output = new FileImageOutputStream(file);

writer.setOutput(output);

IIOImage image = new IIOImage(bufImage, null, null);

writer.write(null, image, iwp);

writer.dispose();

String scriptName = dirname + "\\" + "setwallpaper.bat";

File s = new File(scriptName);

BufferedWriter wr = new BufferedWriter(new FileWriter(s));

wr.write(":: Configure Wallpaper");

wr.newLine();

wr.write("REG ADD \"HKCU\\Control Panel\\Desktop\" /V Wallpaper /T REG_SZ /F /D \"" + fname + "\"");

wr.newLine();

wr.write("REG ADD \"HKCU\\Control Panel\\Desktop\" /V WallpaperStyle /T REG_SZ /F /D 0");

wr.newLine();

wr.write("REG ADD \"HKCU\\Control Panel\\Desktop\" /V TileWallpaper /T REG_SZ /F /D 2");

wr.newLine();

wr.write(":: Make the changes effective immediately");

wr.newLine();

wr.write("%SystemRoot%\\System32\\RUNDLL32.EXE user32.dll, UpdatePerUserSystemParameters");

wr.newLine();

wr.close();

String cmd = "cmd /C start /D\"" + dirname + "\" setwallpaper.bat ";

System.out.println(cmd);

Process p = Runtime.getRuntime().exec(cmd);

try

{

p.waitFor();

}

catch (InterruptedException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("Done");

} catch (IOException e) {

e.printStackTrace();

}

}

}

catch (MalformedURLException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

catch (IOException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

}

private static RSSReader instance = null;

private RSSReader() {

}

public static RSSReader getInstance() {

if(instance == null) {

instance = new RSSReader();

}

return instance;

}

public void writeNews() {

try {

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

String base = "http://apod.nasa.gov/apod/";

URL u = new URL(base + "astropix.html"); // your feed url

BufferedReader in = new BufferedReader(new InputStreamReader(u

.openStream()));

HTMLEditorKit.Parser parse = new HTMLParse().getParser();

parse.parse(in,new HREFCallback(base),true);

}

catch (Exception ex)

{

//do nothing

}

}

public static void main(String[] args) {

RSSReader reader = RSSReader.getInstance();

reader.writeNews();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值