1. 程式人生 > >C#實現動態桌面背景圖片切換

C#實現動態桌面背景圖片切換

問題描述:凝視桌面背景,突感如果桌面背景是變化的像win7一樣,該多有意思啊。鬧鐘瞬間產生一個念頭,用C#寫一個動態切換桌面背景的圖片。如何實現這個想法了,我思考了一會兒,想到了如下的一些需要解決的問題:

  (1):以何種方式實現切換圖片,才能更符合客戶的要求。

  (2):C#使用什麼技術來切換桌面的背景圖片。

  (3):如何儲存和讀取圖片。

問題解決:

  (1):以何種方式呈現呢?控制檯?winform?最後思考後,決定用windows services來實現。因為它可以隨windows啟動而啟動,而且在使用者不知不覺中改變,默默無為做自己的事情,簡單。我以前沒搞過windows services,在網上search一下,大致明白了其中的原理。於是想做一個簡單的例子來實現。例子實現功能:寫一個服務,定時提示一個message。程式碼很快就寫完了,可註冊後,總是不能啟動服務,也沒啥提示資訊。問題很犀利,我Search一個小時,才知道需要設定服務的屬性:允許服務與桌面互動。我設定了,並且重啟服務,果然出現提示資訊,但這個問題總不能每次都讓客戶去解決吧,在網上Search解決方案。關鍵程式碼如下:

程式碼         private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
        {
            ConnectionOptions coOptions 
= new ConnectionOptions();
            coOptions.Impersonation 
= ImpersonationLevel.Impersonate;
            ManagementScope mgmtScope 
= new System.Management.ManagementScope(@"root/CIMV2", coOptions);
            mgmtScope.Connect();
            ManagementObject wmiService;
            wmiService 
= new ManagementObject("Win32_Service.Name='" + this.serviceInstaller1.ServiceName + "'");
            ManagementBaseObject InParam 
= wmiService.GetMethodParameters("Change");
            InParam
["DesktopInteract"]= true;
            ManagementBaseObject OutParam 
= wmiService.InvokeMethod("Change", InParam, 
null);
        }

   第一個問題總算解決了。

  (2):如何切換圖片,Search一下,似乎就一個辦法,呼叫系統的API,不過圖片只能是BMP格式。程式碼如下:

程式碼         #region System Innerface
        
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]public static extern int SystemParametersInfo(
            
int uAction,
            
int uParam,
            string lpvParam,
            
int fuWinIni
         );
        #endregion


        #region Timer Elapsed
        private void dynamicTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            
if (picIndex < PicturePath.Count)
            {
                SetDesktopPicture(PicturePath
[picIndex].ToString());
                picIndex 
+=1;
            }
            
else
            {
                picIndex 
=0;
                SetDesktopPicture(PicturePath
[picIndex].ToString());
            }
        }
        #endregion

  (3):怎麼來儲存和讀取圖片呢。我選擇了用XML檔案來儲存。需要儲存兩個資訊,一個是多長時間切換圖片背景,二是圖片的路徑。在服務啟動的時候我把圖片路徑儲存在一個List中,如果更新了XML圖片資訊,需要重啟服務才能看到效果。關鍵程式碼如下:

程式碼         protected override void OnStart(string[] args)
        {
            
// TODO: 在此處新增程式碼以啟動服務。
            XmlDocument xmlDoc 
= new XmlDocument();
            xmlDoc.
Load(XML_PATH);
            XmlElement xmlEle 
= (XmlElement)xmlDoc.SelectSingleNode("paths");
            timeInterval 
=int.Parse(xmlEle.GetAttribute("time").Trim());
            foreach (XmlNode node 
in xmlDoc.SelectSingleNode("paths").ChildNodes)
            {
                PicturePath.
Add(node.InnerText);
            }
            this.dynamicTimer.Interval 
= timeInterval;
            this.dynamicTimer.Enabled 
= true;
            picIndex 
=0;
        }

總結:關鍵問題都解決了,執行除錯實現了自己的想法。程式還有很多不足之處,如:1)應該設定一個托盤程式來啟動重啟服務,提供一個使用者介面來維護圖片的路徑和切換時間,我是用DOS命令來重啟服務;2) 系統函式只能設定BMP格式的,應該實現用各種形式的圖片,這個很容易搞定;3)應該搞一個安裝包,大家用著也方便啊。