撸一个自动换壁纸桌面应用

        作为一名IT从业人员,一天当中陪着电脑的时间比陪家人的时间还要长。由于长时间盯着电脑屏幕,难免看厌了单调的桌面壁纸。本着换个壁纸,换种心情的目的,尝试了好几个自动换壁纸的windows桌面应用,要不是广告太烦,要不就是弹窗太惹人厌。于是,萌生了自已撸一个自动换壁纸桌面应用的想法。

        现将换壁纸应用的构思、实现过程做以记录:

        一、构思过程:

       自动换壁纸这个诉求,拆开来看主要有两个方面。其一,能够更换桌面壁纸;其二,能够自动换壁纸。

       先说说能够换壁纸。由于 window api 提供了相应的方法,原生支持使用一张图片作为壁纸。所以,能够更换壁纸比较容易实现。

[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
View Code

       再来说说自动换壁纸。自动换壁纸的本质是,隔一段时间换一次壁纸,使用定时器再合适不过了。

       基本上来说,换壁纸容易实现,自动换壁纸也容易实现,只是,万事俱备,只欠东风。这个东风就是图片,或者说是图片源了。

       互联网上有大量的高清图片可用来作为桌面壁纸,所需要的只是下载到本地而已。先来观察一下下面的图片网站。  

       该图片网站提供了图片分类,每个分类包含若干页的图片列表,每个图片列表包含了若干个图片地址,如下图的网页源码所示:  

       既然网页源码中包含了所需要的图片地址,所要做的就是那个网页源码,并解析出源码中的图片地址。获取到图片地址后,调用相关的文件下载方法,将图片下载到本地就可以了。

      二、实现过程:

      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();                
            }
        }
    }
}
View Code

      3. 解析网页源码:由于返回的网站源码被处理成了html格式的字符串,原计划使用处理xml的方式进行解析,发现不可行。于是发现了 HtmlAgilityPack.dll ,该文件可以完美处理返回的html格式字符串,与处理xml的方式近似。

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(content);
doc.DocumentNode.SelectNodes("//nodeName[@nodeAttribute='value']");
View Code

      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);
    }
}
View Code

      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}\tmp.bmp", _imgDir), System.Drawing.Imaging.ImageFormat.Bmp);
                SystemParametersInfo(20, 0, string.Format(@"{0}\tmp.bmp", _imgDir), 0x2);
            }
        }
    }
    catch (Exception ex)
    {
        LogOperation.Error(ex.Message);
    }
}
View Code

      至此,一个自动更换壁纸桌面应用的核心就已经完成了。各位也可以自定义新的图片网站,并完成相应的解析逻辑。完整的源码实现参见 https://github.com/LightSmileMu/AutoChangeWallpaper。

      最后,给出一张效果图,界面有点丑......

posted @ 2018-07-26 15:28  LightSmaile  阅读(921)  评论(0编辑  收藏  举报