zoukankan      html  css  js  c++  java
  • 撸一个自动换壁纸桌面应用

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

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

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

  • 相关阅读:
    不同Activity之间传递线程
    面向对象编程笔记--static
    SQL Server Compact/SQLite Toolbox 使用
    VirtualBox 磁盘容量调整
    scala快速入门
    Microsoft.Xna.Framework.TitleContainer.OpenStream()
    Windows Phone 7 中拷贝文件到独立存储
    Windows Phone 7 上传图片
    JavaScript 中undefined,null,NaN的区别
    CentOS7攻克日记(三) —— 安装Python3.6
  • 原文地址:https://www.cnblogs.com/LightSmile/p/9372044.html
Copyright © 2011-2022 走看看