using AudioWallpaper.Entity; using LibVLCSharp.Shared; namespace AudioWallpaper { public partial class VideoWallpaperWindow : Form { private IntPtr programIntPtr = IntPtr.Zero; private LibVLC? libVLC = new LibVLC(); private MediaPlayer? mediaPlayer; private Media? media; private VideoWallpaperConfigObject videoWallpaperConfig; private AppBarManager appBarManager; public delegate void FullScreenDetected(bool status); public event FullScreenDetected FullScreenDetectedEvent; public VideoWallpaperWindow(VideoWallpaperConfigObject videoWallpaperConfigObject) { videoWallpaperConfig = videoWallpaperConfigObject; appBarManager = new AppBarManager(Handle); InitializeComponent(); Init(); Win32.SetParent(Handle, programIntPtr); PlayerWallPaper(); } protected override void WndProc(ref Message m) { if (appBarManager != null && m.Msg == appBarManager.uCallbackMessage) { switch ((int)m.WParam) { case AppBarManager.ABN_FULLSCREENAPP: bool isFullScreen = m.LParam != IntPtr.Zero; if (isFullScreen) { SetFrom.FullScreenWindowCount++; } else { SetFrom.FullScreenWindowCount--; } ChangeVideoPlayerStatus(SetFrom.FullScreenWindowCount <= 0); //通知其它窗体停止渲染 FullScreenDetectedEvent(SetFrom.FullScreenWindowCount <= 0); break; } } base.WndProc(ref m); } public void DisposeAppBarManager() { appBarManager.Dispose(); } public void PlayerWallPaper() { if (mediaPlayer == null && libVLC != null) { mediaPlayer = new MediaPlayer(libVLC); videoView1.MediaPlayer = mediaPlayer; mediaPlayer.EndReached += MediaPlayer_EndReached; } try { mediaPlayer.SetRate((float)videoWallpaperConfig.Rate / 10f); mediaPlayer.Volume = videoWallpaperConfig.Volume; media = new Media(libVLC, new Uri(videoWallpaperConfig.Url)); mediaPlayer.Play(media); } catch (Exception e) { Console.WriteLine(e.StackTrace); } GC.Collect(); } /// /// 监听视频播放结束事件,重复播放 /// /// /// private void MediaPlayer_EndReached(object? sender, EventArgs e) { if (media != null && mediaPlayer != null) { ThreadPool.QueueUserWorkItem((p) => { mediaPlayer.Play(media); GC.Collect(); }); } } public void ReShow(int x, int y, int width, int height) { SetBounds(x, y, width, height); } public void ReShow(VideoWallpaperConfigObject videoWallpaperConfigObject) { if (videoWallpaperConfig.Url != null && videoWallpaperConfig.Url.Equals(videoWallpaperConfigObject.Url) && media != null && mediaPlayer != null) { mediaPlayer.SetRate((float)videoWallpaperConfigObject.Rate / 10f); mediaPlayer.Volume = videoWallpaperConfigObject.Volume; videoWallpaperConfig = videoWallpaperConfigObject; return; } videoWallpaperConfig = videoWallpaperConfigObject; PlayerWallPaper(); } /// /// 窗体被关闭时,关闭视频播放相关 /// /// /// private void VideoWallpaperWindow_FormClosing(object sender, FormClosingEventArgs e) { VideoDispose(); } public void VideoDispose() { if (mediaPlayer != null) { mediaPlayer.EndReached -= MediaPlayer_EndReached; mediaPlayer.Stop(); mediaPlayer.Dispose(); mediaPlayer = null; } if (media != null) { media.Dispose(); media = null; } if (libVLC != null) { libVLC.Dispose(); libVLC = null; } } public void ChangeVideoPlayerStatus(bool status) { if (!videoWallpaperConfig.AutoStopWallPaper) { if (mediaPlayer != null) { mediaPlayer.SetPause(false); } return; } if (mediaPlayer != null) { mediaPlayer.SetPause(!status); } } public void Init() { // 通过类名查找一个窗口,返回窗口句柄。 programIntPtr = Win32.FindWindow("Progman", null); // 窗口句柄有效 if (programIntPtr != IntPtr.Zero) { IntPtr result = IntPtr.Zero; // 向 Program Manager 窗口发送 0x52c 的一个消息,超时设置为0x3e8(1秒)。 Win32.SendMessageTimeout(programIntPtr, 0x52c, IntPtr.Zero, IntPtr.Zero, 0, 0x3e8, result); // 遍历顶级窗口 Win32.EnumWindows((hwnd, lParam) => { // 找到包含 SHELLDLL_DefView 这个窗口句柄的 WorkerW if (Win32.FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", null) != IntPtr.Zero) { // 找到当前 WorkerW 窗口的,后一个 WorkerW 窗口。 IntPtr tempHwnd = Win32.FindWindowEx(IntPtr.Zero, hwnd, "WorkerW", null); Win32.ShowWindow(tempHwnd, 0); } return true; }, IntPtr.Zero); } } } }