博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
撸一个自动换壁纸桌面应用
阅读量:5922 次
发布时间:2019-06-19

本文共 2911 字,大约阅读时间需要 9 分钟。

        作为一名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。

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

转载于:https://www.cnblogs.com/LightSmile/p/9372044.html

你可能感兴趣的文章
TextGrocery中文文本分类处理
查看>>
WinForm 之 自定义标题栏的窗体移动
查看>>
可汗学院超经典、超实用概率论总结——商女不知忘国恨,隔江犹看概率论
查看>>
ftoa浮点型转换成字符串
查看>>
使用Costura.Fody将源DLL合并到目标EXE
查看>>
今年暑假不AC
查看>>
sql语句中----删除表数据drop、truncate和delete的用法
查看>>
算法学习之路|A除以B
查看>>
《驾驭大数据》一3.6 博彩业:筹码跟踪数据的价值
查看>>
Resx 文件无效,未能加载 .RESX 文件中使用的类型
查看>>
[J2MEQ&A]WTK初始化WMAClient报错XXX has no IP address的解释
查看>>
Linux中daemon()函数的使用
查看>>
29.Flutter与原生解耦式混合开发
查看>>
编码 GBK 的不可映射字符
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
oracle创建dblink
查看>>
Eclipse 插件 FindBugs安装和使用
查看>>
smartctl---查看硬件接口
查看>>
深入理解Java的接口和抽象类
查看>>
fail2ban 帮助postfix 过滤恶意IP
查看>>