0、开始:

  演示视频:请移至(bilibili)

  源代码:请移至(码云)

  下面是关键实现,具体请看仓库源码。

1、创建工程

  打开vs2017,选择 文件 > 新建 > 项目 > Windows 窗体应用

2、声明用到的Win32API

  添加一个 Win32.cs 静态类,里面的API我们用到时,再说。

public static class Win32
{[DllImport("user32.dll")]public static extern IntPtr FindWindow(string className,string winName);[DllImport("user32.dll")]public static extern IntPtr SendMessageTimeout(IntPtr hwnd, uint msg, IntPtr wParam, IntPtr lParam, uint fuFlage, uint timeout, IntPtr result);[DllImport("user32.dll")]public static extern bool EnumWindows(EnumWindowsProc proc,IntPtr lParam);public delegate bool EnumWindowsProc(IntPtr hwnd, IntPtr lParam);[DllImport("user32.dll")]public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string className, string winName);[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hwnd,int nCmdShow);[DllImport("user32.dll")]public static extern IntPtr SetParent(IntPtr hwnd,IntPtr parentHwnd);
}

3、代码

  Form1.cs

  1 public partial class Form1 : Form
  2 {
  3     // 指向 Program Manager 窗口句柄
  4     private IntPtr programIntPtr = IntPtr.Zero;
  5
  6     // 桌面背景窗口
  7     private BgForm bgForm = null;
  8
  9     public Form1()
 10     {
 11         InitializeComponent();
 12
 13         // 设置循环播放
 14         axWindowsMediaPlayer1.settings.setMode("loop", true);
 15     }
 16
 17     private void Form1_Load(object sender, EventArgs e)
 18     {
 19
 20     }
 21
 22     public void Init()
 23     {
 24         // 通过类名查找一个窗口,返回窗口句柄。
 25         programIntPtr = Win32.FindWindow("Progman", null);
 26
 27         // 窗口句柄有效
 28         if(programIntPtr != IntPtr.Zero)
 29         {
 30
 31             IntPtr result = IntPtr.Zero;
 32
 33             // 向 Program Manager 窗口发送 0x52c 的一个消息,超时设置为0x3e8(1秒)。
 34             Win32.SendMessageTimeout(programIntPtr, 0x52c, IntPtr.Zero, IntPtr.Zero, 0, 0x3e8, result);
 35
 36             // 遍历顶级窗口
 37             Win32.EnumWindows((hwnd, lParam) =>
 38             {
 39                 // 找到包含 SHELLDLL_DefView 这个窗口句柄的 WorkerW
 40                 if (Win32.FindWindowEx(hwnd,IntPtr.Zero, "SHELLDLL_DefView", null) != IntPtr.Zero)
 41                 {
 42                     // 找到当前 WorkerW 窗口的,后一个 WorkerW 窗口。
 43                     IntPtr tempHwnd = Win32.FindWindowEx(IntPtr.Zero, hwnd, "WorkerW", null);
 44
 45                     // 隐藏这个窗口
 46                     Win32.ShowWindow(tempHwnd, 0);
 47                 }
 48                 return true;
 49             }, IntPtr.Zero);
 50         }
 51     }
 52
 53     // 打开视频按钮 的事件
 54     private void button2_Click(object sender, EventArgs e)
 55     {
 56         // 创建对话框
 57         OpenFileDialog dialog = new OpenFileDialog();
 58         // 设置过滤器,只允许 .wmv 和 mp4 格式的视频。
 59         dialog.Filter = "视频(*.wmv;*.mp4)|*.wmv;*.mp4";
 60
 61         DialogResult result = dialog.ShowDialog();
 62
 63         if(result == DialogResult.OK)
 64         {
 65             // 把打开的视频路径,给播放器。
 66             axWindowsMediaPlayer1.URL = dialog.FileName;
 67
 68             // 播放视频。
 69             axWindowsMediaPlayer1.Ctlcontrols.play();
 70         }
 71     }
 72
 73     // 设置壁纸 按钮事件
 74     private void button1_Click(object sender, EventArgs e)
 75     {
 76         if(bgForm == null)
 77         {
 78             // 创建背景窗口
 79             bgForm = new BgForm();
 80
 81             // 初始化桌面窗口
 82             Init();
 83
 84             // 窗口置父,设置背景窗口的父窗口为 Program Manager 窗口
 85             Win32.SetParent(bgForm.Handle, programIntPtr);
 86
 87             // 显示背景窗口
 88             bgForm.Show();
 89         }
 90
 91         // 预览窗口视频暂停播放
 92         axWindowsMediaPlayer1.Ctlcontrols.pause();
 93
 94         // 背景窗口视频播放
 95         bgForm.Play(axWindowsMediaPlayer1);
 96     }
 97
 98     // 播放器的状态发生改变,为了解决无缝视频循环。
 99     private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
100     {
101         // 播放结束
102         if(axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
103         {
104             // 无黑屏循环播放视频
105             axWindowsMediaPlayer1.Ctlcontrols.currentPosition = 0;
106         }
107     }
108 }

  BgForm.cs

 1     public partial class BgForm : Form
 2     {
 3         public BgForm()
 4         {
 5             InitializeComponent();
 6
 7             // 隐藏播放器的ui
 8             axWindowsMediaPlayer1.uiMode = "none";
 9
10             // 最大化窗口(全屏)
11             WindowState = FormWindowState.Maximized;
12
13             // 如果最大化窗口,屏幕边缘出现缝隙。改用如下代码进行全屏:
14             // this.Bounds = Screen.PrimaryScreen.Bounds;
15
16             // 设置循环播放
17             axWindowsMediaPlayer1.settings.setMode("loop", true);
18         }
19
20         // 播放方法,在Form1中有调用。
21         public void Play(AxWMPLib.AxWindowsMediaPlayer mediaPlayer)
22         {
23             // 使用Form1预览窗口中 url、音量。
24             axWindowsMediaPlayer1.URL = mediaPlayer.URL;
25             axWindowsMediaPlayer1.settings.volume = mediaPlayer.settings.volume;
26
27             // 背景窗口播放器,播放视频。
28             axWindowsMediaPlayer1.Ctlcontrols.play();
29         }
30
31         // 跟Form1预览窗口,中一样,解决无缝视频播放。
32         private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
33         {
34             if(axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
35             {
36                 axWindowsMediaPlayer1.Ctlcontrols.currentPosition = 0;
37             }
38
39         }
40     }

5、完成

  演示视频:请移至(bilibili)

  源代码:请移至(码云)

转载于:https://www.cnblogs.com/jiuxuan/p/7282541.html

动态壁纸-软件制作-教程相关推荐

  1. Android动态壁纸的制作教程

    动态壁纸是在Android 2.1新增的一个功能.动态壁纸可以添加到Android的桌面,具有交互式的动画背景效果.在本教程中,我们将教会你如何去制作一个交互式的动态壁纸. 动态壁纸是一个Androi ...

  2. 柚子壁纸为什么自动安装_Wallpaper Engine,Windows最好用的动态壁纸软件,附教程!...

    Wallpaper Engine相信不少小伙伴都听说过,是一款非常专业的动态壁纸软件,目前在Steam售价19元,其实也不算贵,但是个人总觉得花这钱整一个动态壁纸软件,不是很划算,毕竟不是必需品啊! ...

  3. wallpaper动态壁纸软件

    对于长期烦恼找不到好看的动态壁纸的小伙伴们来说,wallpaper动态壁纸(软件下载地址)绝对是救命仙丹,这是由吾爱论坛网友自制分享的一款超好用的动态壁纸软件,内置Steam和bilibili解析,可 ...

  4. bazel 链接第三方动态库_Windows最好用的动态壁纸软件,用了都说好!!

    Wallpaper Engine相信不少小伙伴都听说过,是一款非常专业的动态壁纸软件,目前在Steam售价19元,其实也不算贵,但是个人总觉得花这钱整一个动态壁纸软件,不是很划算,毕竟不是必需品啊!用 ...

  5. 使用C++实现的仿Wallpaper动态壁纸软件(含源文件)

    在上一篇博客中,已经介绍了wallpaper的实现原理,并用C#实现,本文将使用C++和Qt框架实现,由于之前已经介绍过具体思路,本文将跳过分析过程,直接上代码. 新建Qt项目,系统自动生成widge ...

  6. 1M都不到的极简动态壁纸软件,爱了爱了!

    版权归作者所有,任何形式转载请联系作者. 作者:清霁丶(来自豆瓣) 来源:https://www.douban.com/note/781103669/ 前言 现在的人啊,闲着就喜欢弄点花里胡哨的东西, ...

  7. Live Wallpaper HD for Mac(天气动态壁纸软件)

    Live Wallpaper HD for Mac是Mac平台上一款具有动态壁纸.详细天气预报.模拟时钟功能的天气动态壁纸软件,Live Wallpaper HD 中文破解版包含14张高清动态手机或电 ...

  8. 有趣的动态壁纸如何制作

    随着科技的发展,很多人已经不再满足于静态的图片,不管是在平时的聊天还是关于手机的壁纸都是如此,在聊天的时候会使用到GIF动态图,手机中的壁纸也会设置成动态的,那今天分享一下有趣的动态壁纸如何制作吧! ...

  9. 推荐三款动态壁纸软件,足够让你的桌面惊艳!

    点击上方"码农的后花园",选择"星标" 公众号 精选文章,第一时间送达 今天给大家推荐三款动态壁纸软件,给你的桌面添加一点精彩,心情也更美呢 ~ 1,WinDy ...

最新文章

  1. win7系统怎么获取system权限?
  2. UVA10780:Again Prime? No Time(数论)
  3. spring boot基础教程:入门程序Hello World的编写
  4. 只会用单片机点灯,很丢人吗?
  5. css3-6 表格如何设置样式和定位样式是什么
  6. 机器学习集群_机器学习中的多合一集群技术在无监督学习中应该了解
  7. Watson的未来就是IBM的未来
  8. 学习用Python编程时要避免的3个错误
  9. 学python买什么书-19年学习Python有什么好的书籍推荐吗?
  10. 计算机不能打印图片,win7系统电脑连接打印机可以打印文档不能打印图片的解决方法...
  11. tcc-transaction深入理解
  12. 四叉树lod结合灯塔AOI
  13. 某型发动机整机测试研究
  14. Speedoffice(word)如何添加小方框和勾
  15. matlab多元回归分析怎么计算,matlab在多元线性回归分析中的相关计算
  16. 2022小红书搜索词布局实战手册
  17. 获取月份的第一天和最后一天
  18. 超能粒子炮·改 HYSBZ - 4591
  19. Ubuntu 16.04安装Zimbra邮件服务器
  20. 来,打一下五笔的字根表

热门文章

  1. 带你快速通过字节跳动面试,看看这篇文章吧!
  2. MVC5-Scaffolder
  3. aspx创建控件时出错,服务器标记的格式不正确
  4. 【小技巧】2345——劫持浏览器主页(Chrome、Edge)
  5. scp 的拷贝限速功能
  6. 迪杰斯特拉算法(dijkstra)_朴素版_堆优化版
  7. P1688 餐厅点餐
  8. 学习ios Metal(9)—iphone X真实感深度相机True Depth Camera的调用和metal GPGPU
  9. H5+Vue2: input(number/tel)唤起数字键盘,踩坑日记
  10. Bagging你真的懂吗