动态壁纸-软件制作-教程
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
动态壁纸-软件制作-教程相关推荐
- Android动态壁纸的制作教程
动态壁纸是在Android 2.1新增的一个功能.动态壁纸可以添加到Android的桌面,具有交互式的动画背景效果.在本教程中,我们将教会你如何去制作一个交互式的动态壁纸. 动态壁纸是一个Androi ...
- 柚子壁纸为什么自动安装_Wallpaper Engine,Windows最好用的动态壁纸软件,附教程!...
Wallpaper Engine相信不少小伙伴都听说过,是一款非常专业的动态壁纸软件,目前在Steam售价19元,其实也不算贵,但是个人总觉得花这钱整一个动态壁纸软件,不是很划算,毕竟不是必需品啊! ...
- wallpaper动态壁纸软件
对于长期烦恼找不到好看的动态壁纸的小伙伴们来说,wallpaper动态壁纸(软件下载地址)绝对是救命仙丹,这是由吾爱论坛网友自制分享的一款超好用的动态壁纸软件,内置Steam和bilibili解析,可 ...
- bazel 链接第三方动态库_Windows最好用的动态壁纸软件,用了都说好!!
Wallpaper Engine相信不少小伙伴都听说过,是一款非常专业的动态壁纸软件,目前在Steam售价19元,其实也不算贵,但是个人总觉得花这钱整一个动态壁纸软件,不是很划算,毕竟不是必需品啊!用 ...
- 使用C++实现的仿Wallpaper动态壁纸软件(含源文件)
在上一篇博客中,已经介绍了wallpaper的实现原理,并用C#实现,本文将使用C++和Qt框架实现,由于之前已经介绍过具体思路,本文将跳过分析过程,直接上代码. 新建Qt项目,系统自动生成widge ...
- 1M都不到的极简动态壁纸软件,爱了爱了!
版权归作者所有,任何形式转载请联系作者. 作者:清霁丶(来自豆瓣) 来源:https://www.douban.com/note/781103669/ 前言 现在的人啊,闲着就喜欢弄点花里胡哨的东西, ...
- Live Wallpaper HD for Mac(天气动态壁纸软件)
Live Wallpaper HD for Mac是Mac平台上一款具有动态壁纸.详细天气预报.模拟时钟功能的天气动态壁纸软件,Live Wallpaper HD 中文破解版包含14张高清动态手机或电 ...
- 有趣的动态壁纸如何制作
随着科技的发展,很多人已经不再满足于静态的图片,不管是在平时的聊天还是关于手机的壁纸都是如此,在聊天的时候会使用到GIF动态图,手机中的壁纸也会设置成动态的,那今天分享一下有趣的动态壁纸如何制作吧! ...
- 推荐三款动态壁纸软件,足够让你的桌面惊艳!
点击上方"码农的后花园",选择"星标" 公众号 精选文章,第一时间送达 今天给大家推荐三款动态壁纸软件,给你的桌面添加一点精彩,心情也更美呢 ~ 1,WinDy ...
最新文章
- win7系统怎么获取system权限?
- UVA10780:Again Prime? No Time(数论)
- spring boot基础教程:入门程序Hello World的编写
- 只会用单片机点灯,很丢人吗?
- css3-6 表格如何设置样式和定位样式是什么
- 机器学习集群_机器学习中的多合一集群技术在无监督学习中应该了解
- Watson的未来就是IBM的未来
- 学习用Python编程时要避免的3个错误
- 学python买什么书-19年学习Python有什么好的书籍推荐吗?
- 计算机不能打印图片,win7系统电脑连接打印机可以打印文档不能打印图片的解决方法...
- tcc-transaction深入理解
- 四叉树lod结合灯塔AOI
- 某型发动机整机测试研究
- Speedoffice(word)如何添加小方框和勾
- matlab多元回归分析怎么计算,matlab在多元线性回归分析中的相关计算
- 2022小红书搜索词布局实战手册
- 获取月份的第一天和最后一天
- 超能粒子炮·改 HYSBZ - 4591
- Ubuntu 16.04安装Zimbra邮件服务器
- 来,打一下五笔的字根表
热门文章
- 带你快速通过字节跳动面试,看看这篇文章吧!
- MVC5-Scaffolder
- aspx创建控件时出错,服务器标记的格式不正确
- 【小技巧】2345——劫持浏览器主页(Chrome、Edge)
- scp 的拷贝限速功能
- 迪杰斯特拉算法(dijkstra)_朴素版_堆优化版
- P1688 餐厅点餐
- 学习ios Metal(9)—iphone X真实感深度相机True Depth Camera的调用和metal GPGPU
- H5+Vue2: input(number/tel)唤起数字键盘,踩坑日记
- Bagging你真的懂吗