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

作为一名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}\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);
    }
}

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

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

原文地址:https://www.cnblogs.com/LightSmile/p/9372044.html

时间: 2024-08-29 02:38:54

撸一个自动换壁纸桌面应用的相关文章

Android开发之自动更换壁纸

本程序主要实现了: 1.使用AssetManager将assets目录中的文件复制到SD卡的指定位置 2.使用AlarmManager全局定时器,周期性的启动指定组件切换壁纸 3.使用SharedPreferences,将用户个性化的设置保存到手机(例如壁纸切换频率) 4.使用自定义标题栏 5.使用了GestureDetector手势检测器,允许用户滑动切屏 6.使用了overridePendingTransition,在切屏的时候有动画效果 程序运行效果图: 程序代码: ChangeWallp

运行全屏程序自动切回桌面的问题

最近遇到的问题,运行全屏程序,比如游戏·视频等,每隔一段时间自动切回到桌面,运行其他非全屏程序会失去当前焦点,比如窗口变灰.百度了很多,查看任务计划,兼容性,注册表等等,都没解决.最后利用排除法,一个个kill进程,最后测试出一个进程QQprotect.exe,有它在,就出这问题,kill掉它,完美解决.这是个腾讯qq的安全保护进程,运行qq必备,联系了客服,客服说给反馈,等吧.目前qq7.2版本,7.3版本都有这个问题,不知道是我的个案还是通病,win7  32位系统.排除病毒,其他插件问题.

手撸一个SpringBoot的Starter,简单易上手

前言:今天介绍一SpringBoot的Starter,并手写一个自己的Starter,在SpringBoot项目中,有各种的Starter提供给开发者使用,Starter则提供各种API,这样使开发SpringBoot项目变得简单.实际上Starter简单来说就是Spring+SpringMVC开发的.话不多说开始撸代码 1.创建项目 首先在idea中创建SpringBoot项目,并首先创建一个BeautyProperties类,代码代码如下: package com.mystarter; im

C++11实现一个自动注册的工厂

实现动机 工厂方法是最简单地创建派生类对象的方法,也是很常用的,工厂方法内部使用switch-case根据不同的key去创建不同的派生类对象,下面是一个伪代码. Message* create(int type) { switch (type) { case MSG_PGSTATS: m = new MPGStats; break; case MSG_PGSTATSACK: m = new MPGStatsAck; break; case CEPH_MSG_STATFS: m = new MSt

Linux 随机换壁纸

Mint的默认壁纸看久了有点不舒服,于是就想换几张图片看看. 找了会,没看到跟windows一样可以随机切壁纸的功能啥的,所有就写了个脚本实现下. 系统是Linux-Mint17.3,不过应该都是通用的,脚本如下: yibo-mint Desktop # vim ran_wallpaper.sh  #!/bin/bash   wallpaper_path="/data/wallpaper" # 壁纸路径 sleep_time=1  # 更换间隔 单位秒   find $wallpape

“挖掘机”升级路 二篇(04)--分享一个自动配置的脚本

掰着指头算算,今天是周三,也就意味着我从接触Hadoop到搭建集群Hadoop.HBase.Hive已经过去了四天,结果是我依然没有搭建完成,还在苦苦挣扎.这周一定要让完整的Hadoop跑起来,不然也真是太不像话了. 今天我想想干了些啥,早上路过青年路的时候买了个馒头,他居然要了我两块钱!!!不是什么营养馒头,就是路边摊.一笔带过,发泄一下. 今天的工作要分为两段来说,早上是自己接着在研究HBase的集群配置,遇到的主要问题就是两个,第一个就是当我配置slave机器的时候,在hbase-site

初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助

初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: 1 var fs = require('fs'); 2 var tel = [ 3 "1/2/4/6/a.tpl.html", 4 "1/2/4/7/9/c.tpl.html", 5 "1/3/5/8/b.tpl.html"]; 6 var demo = function (mulu)

python小练习,打出1-100之间的所有偶数,设计一个函数,在桌面上创建10个文件,并以数字命名,复利计算函数

练习一:打出1-100之间的所有偶数 def even_print(): for i in range(1,101): if i % 2 == 0: print (i) even_print() 练习二:设计一个函数,在桌面上创建10个文件,并以数字命名 def text_creation(): path = 'C:/Users/Administrator/Desktop' for name in range (1,11): with open(path + str(name) + '.txt'

Mockplus原型交互跟我做之1 - 30秒做一个自动消失的消息框(Toast)

从现在做,跟我一起来认识Mockplus的交互. Mockplus的交互,非常简单.直观.容易上手.你所需要做的,只是拖一拖鼠标,然后几步设置而已. 当然,只要你愿意,还可以实现强大的交互效果. 不废话,先来做一个,试试. 我们来做一个自动消失的消息框(Toast). 请看视频: