作为一名IT从业人员,一天当中陪着电脑的时间比陪家人的时间还要长。由于长时间盯着电脑屏幕,难免看厌了单调的桌面壁纸。本着换个壁纸,换种心情的目的,尝试了好几个自动换壁纸的windows桌面应用,要不是广告太烦,要不就是弹窗太惹人厌。于是,萌生了自已撸一个自动换壁纸桌面应用的想法。
现将换壁纸应用的构思、实现过程做以记录:
一、构思过程:
自动换壁纸这个诉求,拆开来看主要有两个方面。其一,能够更换桌面壁纸;其二,能够自动换壁纸。
先说说能够换壁纸。由于 window api 提供了相应的方法,原生支持使用一张图片作为壁纸。所以,能够更换壁纸比较容易实现。
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")] public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
再来说说自动换壁纸。自动换壁纸的本质是,隔一段时间换一次壁纸,使用定时器再合适不过了。
基本上来说,换壁纸容易实现,自动换壁纸也容易实现,只是,万事俱备,只欠东风。这个东风就是图片,或者说是图片源了。
互联网上有大量的高清图片可用来作为桌面壁纸,所需要的只是下载到本地而已。先来观察一下下面的图片网站。
该图片网站提供了图片分类,每个分类包含若干页的图片列表,每个图片列表包含了若干个图片地址,如下图的网页源码所示:
既然网页源码中包含了所需要的图片地址,所要做的就是那个网页源码,并解析出源码中的图片地址。获取到图片地址后,调用相关的文件下载方法,将图片下载到本地就可以了。
二、实现过程:
1. 定义图片源:通过配置文件,配置几个常用的图片网站。
2. 获取网页源码:使用HttpWebRequest请求图片网站。
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; if (request != null) { request.Timeout = 15 * 1000; using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { if (response != null) { Stream steam = response.GetResponseStream(); if (steam != null) { StreamReader reader = new StreamReader(steam); string content = reader.ReadToEnd(); } } } }
3. 解析网页源码:由于返回的网站源码被处理成了html格式的字符串,原计划使用处理xml的方式进行解析,发现不可行。于是发现了 HtmlAgilityPack.dll ,该文件可以完美处理返回的html格式字符串,与处理xml的方式近似。
HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(content); doc.DocumentNode.SelectNodes("//nodeName[@nodeAttribute='value']");
4. 获取图片分类:通过HtmlAgilityPack提供的查找节点方法,找到图片分类所在节点,并加载图片分类。
5. 获取图片分类包含的页码:请求某个图片分类,返回该图片分类对应的网页源码。通过HtmlAgilityPack提供的查找节点方法,找到分页导航所在节点,并加载图片分类对应的所有页。
6. 获取图片下载地址:随机请求某个图片分类的某一页,返回该页的网页源码,通过HtmlAgilityPack提供的查找节点方法,找到图片列表所在界面,解析图片下载地址。
7. 下载图片:调用下载文件的方法,下载图片。
public void DownLoadFile(string url, string fileName) { try { WebClient myWebClient = new WebClient(); myWebClient.DownloadFile(url, fileName); } catch (Exception ex) { LogOperation.Error(ex.Message); } }
8. 设置桌面壁纸:调用window api 设置桌面壁纸。
private void SetWallPaper(string fileName) { try { if (File.Exists(fileName)) { if (!Directory.Exists(_imgDir)) { Directory.CreateDirectory(_imgDir); } using (Image image = Image.FromFile(fileName)) { image.Save(string.Format(@"{0} mp.bmp", _imgDir), System.Drawing.Imaging.ImageFormat.Bmp); SystemParametersInfo(20, 0, string.Format(@"{0} mp.bmp", _imgDir), 0x2); } } } catch (Exception ex) { LogOperation.Error(ex.Message); } }
至此,一个自动更换壁纸桌面应用的核心就已经完成了。各位也可以自定义新的图片网站,并完成相应的解析逻辑。完整的源码实现参见 https://github.com/LightSmileMu/AutoChangeWallpaper。
最后,给出一张效果图,界面有点丑......