1. 程式人生 > >擼一個自動換壁紙桌面應用

擼一個自動換壁紙桌面應用

dhtml private log png pack fromfile 定時器 圖片列表 處理xml

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

最後,給出一張效果圖,界面有點醜......

技術分享圖片

擼一個自動換壁紙桌面應用