• 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)应该搞一个安装包,大家用着也方便啊。

      
  • 相关阅读:
    用ASP.Net2005和Oracle9i做模糊查询时报ORA01722错误解决方法
    ☠360与腾讯QQ的战争☠之我见
    【转】GIS原理学习
    【转】JavaScript写的Cookie类
    怀疑自己的笔记本电脑可能受到了网络攻击被人监视或操控
    “密码人”越来越多将会出现“密码危机”
    【转】确保 ASP.NET 应用程序和 Web Services 的安全
    超图软件(SuperMap)学习资料:桌面软件(Deskpro)
    用Sql Server 2000的数据库备份来还原Sql Server 2005中的数据库
    一个有用的Windows服务小程序——用来完成Server端的Socket通信
  • 原文地址:https://www.cnblogs.com/BlueWoods/p/1682829.html
Copyright © 2020-2023  润新知