首页 文章详情

Windows 增加开关桌面动态壁纸

DotNet NB | 6 2023-10-24 10:09 0 0 0
UniSMS (合一短信)

 Windows  增加开关桌面动态壁纸

Nimble

作者:WPFDevelopersOrg - 驚鏵

原文链接[1]:https://github.com/WPFDevelopersOrg/Nimble

原文链接[2]:https://gitee.com/WPFDevelopersOrg/Nimble

  • 框架使用.NET40
  • Visual Studio 2019;
  • 项目使用 MIT 开源许可协议;

接着上一篇

  • 支持哪些视频格式:
  • H.264/AVC
  • H.265/HEVC
  • MPEG-4 Part 2
  • MPEG-2
  • VP9
  • AV1
  • WMV
  • FLV
  • WebM
  • MOV
  • MKV
  • MP4
  • AVI
  • 回复上一篇的疑问,自己怎么添加视频文件?
    • 按照以下步骤向Nimble添加视频文件:
    • 将视频文件复制或移动到Nimble安装目录下的"Video"文件夹中。
    • 然后请重新启动Nimble。
  • 同时修复Hook键盘按下时效性过期问题,两种解决方案
    • 第一种管理员身份运行程序。
    • 第二种定时器过一段时间进行卸载重新注册(此处使用第二种)。

1)基于原有功能ConfigHelper增加代码如下:

public static bool OpenWallpaper { getset; }

bool openWallpaper;
if (!bool.TryParse(string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["OpenWallpaper"]) ? "false" : ConfigurationManager.AppSettings["OpenWallpaper"], out openWallpaper))
   OpenWallpaper = false;
else
   OpenWallpaper = Convert.ToBoolean(string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["OpenWallpaper"]) ? "false" : ConfigurationManager.AppSettings["OpenWallpaper"]);
   
public static void SaveOpenWallpaper(bool openWallpaper)
   {
     OpenWallpaper = openWallpaper;
     SaveConfig("OpenWallpaper", openWallpaper.ToString());
   }

2)基于原有功能WallpaperItem增加代码如下:

  • 将原有的修改为 NotifyPropertyChange("ItemName") 来通知属性值的更改
        //public string ItemName { get; set; }
        private string _itemName;
        public string ItemName
        {
            get => _itemName;
            set
            {
                _itemName = value;
                NotifyPropertyChange("ItemName");
            }
        }

3)基于原有功能app.config增加配置代码如下:

 <add key="OpenWallpaper" value="true"/>

4)基于原有功能MainVM.cs增加代码如下:

  • names 集合中包含项数大于 0,那么会添加一个新的 WallpaperItem 对象到 names 的末尾。这个对象的 ItemName 属性值为 "壁纸已开启" 或 "壁纸已关闭",取决于配置文件中是否开启了壁纸功能(即 ConfigHelper.OpenWallpaper == true)。VideoPath 属性值为 _exitWallpaper,表示这是退出壁纸的选项,因为当用户选择该选项时,程序会停止播放视频并恢复桌面原本的背景。IsSelected 属性值也与配置文件中的壁纸开启状态相同,以便正确地显示当前选中的壁纸。
        void WallpaersFilePlay()
        {
            WallpaperArray = null;
            #region Wallpaper
            var wallpaersPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Video");
            if (Directory.Exists(wallpaersPath))
            {
                var names = new List<WallpaperItem>();
                var files = Directory.GetFiles(wallpaersPath);
                foreach (var filePath in files)
                {
                    var fileName = Path.GetFileNameWithoutExtension(filePath);
                    names.Add(new WallpaperItem { ItemName = fileName, VideoPath = filePath, IsSelected = ConfigHelper.WallpaperPath == filePath ? true : false });
                }
                if (names.Count > 0)
                    names.Add(new WallpaperItem { ItemName = ConfigHelper.OpenWallpaper == true ? "壁纸已开启" : "壁纸已关闭", VideoPath = _exitWallpaper, IsSelected = ConfigHelper.OpenWallpaper });
                names.Add(new WallpaperItem { ItemName = "更多壁纸请加QQ群:929469013" });
                WallpaperArray = names;
                if (WallpaperArray.Count > 0)
                    ShowWallpaper(ConfigHelper.WallpaperPath);
            }
            #endregion
        }
        
  • 方法接受一个 wallpaperPath 参数,用于显示指定路径的壁纸。如果输入的参数为空或者该路径不存在,方法将会直接返回。

  • 它停止当前正在播放的视频(如果存在),并将壁纸数组中所有非当前壁纸和退出壁纸的选中状态设置为 false。接下来,根据 _exitWallpaper 找到需要退出的壁纸,并将其状态设置为已开启并选中状态为 true。

  • 该方法启动一个新的视频进程,用于播放输入的壁纸路径。如果成功创建了一个窗口句柄,则将其移动到桌面的底层窗口,并且将该壁纸路径保存在程序配置文件中。

        void ShowWallpaper(string wallpaperPath)
        {
            if(string.IsNullOrWhiteSpace(wallpaperPath))
            {
                if(WallpaperArray.Count >= 3 && ConfigHelper.OpenWallpaper)
                {
                    WallpaperArray.First().IsSelected = true;
                    wallpaperPath = WallpaperArray[0].VideoPath;
                }
                    
            }
            if (!File.Exists(wallpaperPath) || !ConfigHelper.OpenWallpaper) return;
            StopFFplayProcess();
            WallpaperArray.Where(x => x.VideoPath != wallpaperPath && x.VideoPath != _exitWallpaper).ToList().ForEach(x =>
            {
                x.IsSelected = false;
            });
            if(ConfigHelper.OpenWallpaper)
            {
                var wallpaper = WallpaperArray.FirstOrDefault(x => x.VideoPath == _exitWallpaper);
                if (wallpaper != null)
                {
                    wallpaper.ItemName = "壁纸已开启";
                    wallpaper.IsSelected = true;
                }
            }
            
            StartFFplayProcess(wallpaperPath);
            if (ffplayWindowHandle != IntPtr.Zero)
            {
                SendMsgToProgman();
                Win32Api.SetParent(ffplayWindowHandle, desktopHandle);
                if (ConfigHelper.WallpaperPath != wallpaperPath)
                    ConfigHelper.SaveWallpaperPath(wallpaperPath);
            }
        }
  • 如果当前壁纸的视频路径与 _exitWallpaper 相等,则执行以下判断:

  • 如果当前壁纸没有被选中(IsSelected 属性为 false),则执行 StopFFplayProcess() 方法来停止正在播放的视频,然后将壁纸的 ItemName 属性设置为 "壁纸已关闭",并将 IsSelected 属性设置为 false

  • 否则,如果当前壁纸已经被选中(IsSelected 属性为 true),则执行 WallpaersFilePlay() 方法来播放视频,然后将壁纸的 ItemName 属性设置为 "壁纸已开启",并将 IsSelected 属性设置为 true

public ICommand WallpaperSelectedCommand => new RelayCommand(obj =>
        {
            if (obj is WallpaperItem wallpaper)
            {
                if (wallpaper.VideoPath == _exitWallpaper)
                {
                    if (!wallpaper.IsSelected)
                    {
                        StopFFplayProcess();
                        wallpaper.ItemName = "壁纸已关闭";
                        wallpaper.IsSelected = false;
                    }
                    else
                    {
                        WallpaersFilePlay();
                        wallpaper.ItemName = "壁纸已开启";
                        wallpaper.IsSelected = true;
                    }
                }
                else
                {
                    if (string.IsNullOrWhiteSpace(wallpaper.VideoPath)) return;
                    if (File.Exists(wallpaper.VideoPath))
                    {
                        ShowWallpaper(wallpaper.VideoPath);
                    }

                }
            }

        });

参考资料

[1]

原文链接: https://github.com/WPFDevelopersOrg/Nimble

[2]

原文链接: https://gitee.com/WPFDevelopersOrg/Nimble


推荐阅读:
.NET静态代码织入——肉夹馍(Rougamo)发布2.0
.NET 8 中的调试增强功能
理解C#中的ValueTask
.NET 使用 ZXing.Net 生成二维码,并识别
使用 Foundatio 轻松构建 .NET 分布式应用
微服务必备,使用 .NET 实现分布式锁

点击下方卡片关注DotNet NB

一起交流学习

▲ 点击上方卡片关注DotNet NB,一起交流学习

请在公众号后台

回复 【路线图】获取.NET 2023开发者路线图
回复 【原创内容】获取公众号原创内容
回复 【峰会视频】获取.NET Conf开发者大会视频
回复 【个人简介】获取作者个人简介
回复 【年终总结】获取作者年终总结
回复 加群加入DotNet NB 交流学习群

长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter