問題描述:凝視桌面背景,突感如果桌面背景是變化的像win7一樣,該多有意思啊。鬧鐘瞬間產生一個念頭,用C#寫一個動態切換桌面背景的圖片。如何實現這個想法了,我思考了一會兒,想到了如下的一些需要解決的問題:
(1):以何種方式實現切換圖片,才能更符合客戶的要求。
(2):C#使用什么技術來切換桌面的背景圖片。
(3):如何存儲和讀取圖片。
問題解決:
(1):以何種方式呈現呢?控制臺?winform?最后思考后,決定用windows services來實現。因為它可以隨windows啟動而啟動,而且在用戶不知不覺中改變,默默無為做自己的事情,簡單。我以前沒搞過windows services,在網上search一下,大致明白了其中的原理。于是想做一個簡單的例子來實現。例子實現功能:寫一個服務,定時提示一個message。代碼很快就寫完了,可注冊后,總是不能啟動服務,也沒啥提示信息。問題很犀利,我Search一個小時,才知道需要設置服務的屬性:允許服務與桌面交互。我設置了,并且重啟服務,果然出現提示信息,但這個問題總不能每次都讓客戶去解決吧,在網上Search解決方案。關鍵代碼如下:
?


????????{
????????????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格式。代碼如下:
?


????????[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圖片信息,需要重啟服務才能看到效果。關鍵代碼如下:
?


????????{
????????????//?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)應該搞一個安裝包,大家用著也方便啊。