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 { get; set; }
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);
}
}
}
});
参考资料
原文链接: https://github.com/WPFDevelopersOrg/Nimble
[2]原文链接: https://gitee.com/WPFDevelopersOrg/Nimble
点击下方卡片关注DotNet NB
一起交流学习
▲ 点击上方卡片关注DotNet NB,一起交流学习
请在公众号后台