Loading... 我们知道,Bing首页的背景图每天都是自动更新的,而且质量很高,及其适合做桌面壁纸。Bing官方虽然有一个程序可以每天自动更换壁纸,但是它添加了搜索框等我不想要的东西,为此,自己用C#简单写了一个,也算是捡一捡好久没用的C#。 # 获取壁纸地址 很明显,第一步是找到每天壁纸的url才可以下载和设置,为此,我找到了一个xml格式的API用于获取当天的壁纸信息: ```bash hljs http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1 ``` 以今天为例(2016-8-20),这个xml文件的结构是这样的: ```xml hljs <images> <image> <startdate>20160819</startdate> <fullstartdate>201608190900</fullstartdate> <enddate>20160820</enddate> <url> /az/hprichbg/rb/LasTeresitasBeach_ZH-CN13683812698_1366x768.jpg </url> <urlBase>/az/hprichbg/rb/LasTeresitasBeach_ZH-CN13683812698</urlBase> <copyright> 圣安德烈斯的特雷西塔海滩,加那利群岛的特内里费岛,西班牙 (© Cornelia Doerr/age fotostock) </copyright> <copyrightlink> http://www.bing.com/search?q=%E7%89%B9%E9%9B%B7%E8%A5%BF%E5%A1%94%E6%B5%B7%E6%BB%A9&form=hpcapt&mkt=zh-cn </copyrightlink> <drk>1</drk> <top>1</top> <bot>1</bot> <hotspots/> </image> <tooltips>...</tooltips> </images> ``` 我们所需要的信息都在imges/image这个节点中,只需要将其解析出来就好了。解析之前,我先建立了一个信息类,用于存储信息和后续维护。 ```cs hljs public class BingInfo { private System.DateTime startTime; private string urlSmall; private string urlBig; private string copyright; public BingInfo() { startTime = System.DateTime.Now; urlSmall = null; copyright = null; } //属性 public string UrlSmall{} { get { return urlSmall; } set { urlSmall = value; } } public string UrlBig { get { return urlBig; } set { urlBig = value; } } public string Copyright { get { return copyright; } set { copyright = value; } } public System.DateTime StartTime { get { return startTime; } set { startTime = value; } } /// <summary> /// 采用Bing的一个xml格式的API,获取数据 /// </summary> public void GetBingInfo() { } } ``` 读取xml信息用到System.XML命名空间下的基本的XmlDocument、XmlElement、XmlNode等基本类。很简单,直接贴代码: ```cs hljs public void GetBingInfo() { XmlDocument doc = new XmlDocument(); doc.Load(@"http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1"); XmlNode xn = doc.SelectSingleNode("images"); xn = xn.SelectSingleNode("image"); XmlNode xn_url = xn.SelectSingleNode("url"); UrlSmall = "http://cn.bing.com/" + xn_url.InnerText; UrlBig = UrlSmall.Replace("1366x768", "1920x1080"); XmlNode xn_copyright = xn.SelectSingleNode("copyright"); Copyright = xn_copyright.InnerText; XmlNode xn_startdata = xn.SelectSingleNode("startdate"); StartTime = System.DateTime.ParseExact(xn_startdata.InnerText, "yyyyMMdd", system.Globalization.CultureInfo.CurrentCulture); } ``` # 下载壁纸 得到图像地址后,需要下载这张图片,这里用的是用 system.net.webclient: ```cs hljs public static string DonloadWallpaper(string url) { string filename = null; try { WebClient client = new WebClient(); filename = Path.GetFileName(url); client.DownloadFile(url, filename); return filename; } catch (Exception ex) { MessageBox.Show(ex.Message); return "Download Fail!"; } } ``` 最后,需要将图片设置为系统桌面,这里引用了user32.dll中的系统底层api: ```cs hljs [DllImport("user32.dll", EntryPoint = "SystemParametersInfo")] public static extern int SystemParametersInfo( int uAction, int uParam, string lpvParam, int fuWinIni ); public static void SetWallpaper(BingInfo WallpaperInfo, int width) { string WallpaperUrl = null; WallpaperInfo.GetBingInfo(); if (width == 1920) WallpaperUrl = WallpaperInfo.UrlBig; else if (width == 1366) WallpaperUrl = WallpaperInfo.UrlSmall; else MessageBox.Show("Resolution Error!"); string filename = DownloadWallpaper(WallpaperUrl); string filepath = Directory.GetCurrentDirectory() + "\\" + filename; int SetResult = SystemParametersInfo(20, 0, filepath, 0x01 | 0x02); if (SetResult != 0) File.Delete(filepath); } ``` 为了方便使用,我将程序写为了托盘形式,添加了一个预览窗体,这里面涉及到了一个PictureBox互相重叠,png仍要保持透明的问题。解决这个问题,一共有两步: 1. 将png的属性BackColor设置为Web下的Transparent; 2. 添加如下语句:其中pictureBox1是底层,pictureBox2是顶层png ```cs hljs pictureBox1.Controls.Add(pictureBox2); ``` # 最终效果 ![](http://blog.lxalxy.com/usr/uploads/2021/03/376682389.png) 项目地址: [https://github.com/lxalxy/GetBingWallpaper](https://github.com/lxalxy/GetBingWallpaper) # 参考文献 [1] [C#操作XML的完整例子——XmlDocument篇](http://blog.csdn.net/cds27/article/details/2305166) [2] [C#设置系统桌面背景API及调用端](http://blog.sina.com.cn/s/blog_13dbdd00a0102vdhr.html) © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏