WPF 实现动态Windows桌面壁纸~

       由于微信群人数太多入群请添加小编微信号

 yanjinhuawechat 或 W_Feng_aiQ 入群

 需备注WPF开发者 

  PS:有更好的方式欢迎推荐。

  此项目灵感来源于 丑萌气质狗 B站同名  

  QQ群:560611514  (学习Unity3D)增加了播放视频。

01

代码如下

一、窗口介绍

Windows操作系统所有的地方都是窗口,可能这也是系统名字的由来吧,包括你看到的文件夹,桌面,右键菜单,这些都是由界面组成的, 这么多窗口需要有一个合理的显示,就需要用到我们的层级关系,比如两个窗体谁显示在前,谁显示在后。

VS给我们提供了一个查找和查看窗口信息的工具,叫做Spy++,在工具里面:

2780ab609d654d15ca7aceb6beac6b8a.png

打开之后了,这里给我们展示了当前系统所有的窗口信息,你也可以点击红色框中的查找工具,来查看你想知道的窗口信息:

d6ff0f6e41b78aa68c20fa002e67eb69.png

来演示一下如何查找窗口,点击上方红色框中的查找窗口按钮,两个随便选一个,会弹出如下窗口:

68067242fbfd36dd1f35c9e39b012e2c.png

然后你点击红色区域中的这个控件拖动到你想获取的信息窗口,就能看到当前窗口的详细信息了,包括窗口的句柄、标题、类。

比如我直接将图标拖到桌面上,可以看到这是他显示桌面的信息:

b4891d6538e9d70bce01a38c189ddf25.png

这里我们关掉这个窗口, 回到Spy++的主界面,拖到最底部:

fc152c38cb7f394aeedfd59ef0ac377c.png

可以看到, Progman Manager是桌面窗口的父窗口,前面小窗口图标是灰色的表示的是此窗口是隐藏的(子窗口拥有和父窗口一致的显示层级)。

二、原理操作

现在,我们只需要把我们的界面,也就是放到 Program Manager下面,然后再适当调整它的显示顺序,就可以了,但是这一块我们不好操作。有一个其他路子就是给窗口发送一个特殊的消息,来让我们有操作的空间。

只需要给 Program Manager窗口发送一个消息0x52C,就可以将Program Manager拆分为多个窗口,分别是Program Manager窗口和两个WorkerW窗口。

下面是已经发送过此消息后的样子:

037205cbb91b5abfdfc98195dc6752c7.png

可以看到Program Manager下面已经什么都没有了,内容全都转移到第一个WokerW窗口下,这时候我们只需要将我们的窗口挂在到Program Manager窗口的下方就能又有和它一样的显示层级了(窗口从下到上依次显示,所以这里Program Manager显示在最底层),不过需要注意的是,在Program Manager和第一个WorkerW窗口之间,还存在另外一个WorkerW窗口,在我的系统中,它默认隐藏了,为了确保效果一致,我们需要手动将它隐藏起来。

三、Win32ApiHelper 代码如下

using System;
using System.Runtime.InteropServices;namespace WPFDevelopers.Helpers
{public class Win32ApiHelper{[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);//查找窗口的委托 查找逻辑public delegate bool EnumWindowsProc(IntPtr hwnd, IntPtr lParam);[DllImport("user32.dll")]public static extern bool EnumWindows(EnumWindowsProc proc, 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);}
}

四、DesktopBackground.xaml 代码如下

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.DesktopBackground"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid><Button Content="选择视频" Height="40" Width="120" Click="Button_Click"/></Grid>
</UserControl>

五、DesktopBackground.xaml.cs 代码如下

using System.Windows;
using System.Windows.Controls;
using WPFDevelopers.Samples.ExampleViews.Desktop;namespace WPFDevelopers.Samples.ExampleViews
{/// <summary>/// WorkerWBackground.xaml 的交互逻辑/// </summary>public partial class DesktopBackground : UserControl{public DesktopBackground(){InitializeComponent();}private void Button_Click(object sender, RoutedEventArgs e){new DesktopPlayVideo().Show();} }
}

六、DesktopPlayVideo.xaml 代码如下

<Window x:Class="WPFDevelopers.Samples.ExampleViews.Desktop.DesktopPlayVideo"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:sys="clr-namespace:System;assembly=mscorlib"xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews.Desktop"xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell"mc:Ignorable="d" Background="Transparent"WindowStyle="None"ResizeMode="NoResize"AllowsTransparency="True"Height="{x:Static SystemParameters.PrimaryScreenHeight}"Width="{x:Static SystemParameters.PrimaryScreenWidth}"><Grid><MediaElement Name="PART_MediaElement"/></Grid>
</Window>
<Window x:Class="WPFDevelopers.Samples.ExampleViews.Desktop.DesktopPlayVideo"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:sys="clr-namespace:System;assembly=mscorlib"xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews.Desktop"xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell"mc:Ignorable="d" Background="Transparent"WindowStyle="None"ResizeMode="NoResize"AllowsTransparency="True"Height="{x:Static SystemParameters.PrimaryScreenHeight}"Width="{x:Static SystemParameters.PrimaryScreenWidth}"><Grid><MediaElement Name="PART_MediaElement"/></Grid>
</Window>

七、DesktopPlayVideo.xaml.cs 代码如下

using System;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Animation;
using WPFDevelopers.Helpers;namespace WPFDevelopers.Samples.ExampleViews.Desktop
{/// <summary>/// DesktopPlayVideo.xaml 的交互逻辑/// </summary>public partial class DesktopPlayVideo : Window{private IntPtr programHandle;public DesktopPlayVideo(){InitializeComponent();this.Loaded += DesktopPlayVideo_Loaded;}private void DesktopPlayVideo_Loaded(object sender, RoutedEventArgs e){Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog();openFileDialog.DefaultExt = ".mp4";openFileDialog.Filter = "视频文件(.MP4)|*.mp4;";if (openFileDialog.ShowDialog() == true){SendMsgToProgman();Width = SystemParameters.PrimaryScreenWidth; Height = SystemParameters.PrimaryScreenHeight; Left = 0; Top = 0;//PART_MediaElement.Source = new Uri(openFileDialog.FileName);//PART_MediaElement.MediaEnded += (s1, e1) => //{//    PART_MediaElement.Position = new TimeSpan(0, 0, 1);//    PART_MediaElement.Play();//};var storyboard = new Storyboard();storyboard.RepeatBehavior = RepeatBehavior.Forever;var mediaTimeline = new MediaTimeline{Source = new Uri(openFileDialog.FileName),};Storyboard.SetTargetName(mediaTimeline, PART_MediaElement.Name);storyboard.Children.Add(mediaTimeline);// 设置当前窗口为 Program Manager的子窗口Win32ApiHelper.SetParent(new WindowInteropHelper(this).Handle, programHandle);PART_MediaElement.Loaded += (s1, e1) =>{storyboard.Begin(PART_MediaElement);};App.CurrentMainWindow.WindowState = WindowState.Minimized;}}/// <summary>/// 向桌面发送消息/// </summary>void SendMsgToProgman(){// 桌面窗口句柄,在外部定义,用于后面将我们自己的窗口作为子窗口放入programHandle = Win32ApiHelper.FindWindow("Progman", null);IntPtr result = IntPtr.Zero;// 向 Program Manager 窗口发送消息 0x52c 的一个消息,超时设置为2秒Win32ApiHelper.SendMessageTimeout(programHandle, 0x52c, IntPtr.Zero, IntPtr.Zero, 0, 2, result);// 遍历顶级窗口Win32ApiHelper.EnumWindows((hwnd, lParam) =>{// 找到第一个 WorkerW 窗口,此窗口中有子窗口 SHELLDLL_DefView,所以先找子窗口if (Win32ApiHelper.FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", null) != IntPtr.Zero){// 找到当前第一个 WorkerW 窗口的,后一个窗口,及第二个 WorkerW 窗口。IntPtr tempHwnd = Win32ApiHelper.FindWindowEx(IntPtr.Zero, hwnd, "WorkerW", null);// 隐藏第二个 WorkerW 窗口Win32ApiHelper.ShowWindow(tempHwnd, 0);}return true;}, IntPtr.Zero);}}
}

02


效果预览

鸣谢素材提供者 - 丑萌气质狗(李飞)

源码地址如下

Github:https://github.com/WPFDevelopersOrg

Gitee:https://gitee.com/WPFDevelopersOrg

作者:丑萌气质狗   学习Unity3D B站搜索 丑萌气质狗 

出处:https://www.cnblogs.com/choumengqizhigou/p/15702980.html

版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

转载请注明出处

QQ群:560611514  (学习Unity3D)

WPF开发者QQ群: 340500857

686d509e71945a9a76c940b425f3c056.png

扫一扫关注我们,

1a0df7c26d1a1b9ab1267b14f13954a7.gif

更多知识早知道!

08f32aecf0ca578377860a0164bcc137.gif

点击阅读原文可跳转至源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux c用open打开(创建)一个文件

1、文件描述符 Linux操作系统内核(kernel)利用文件描述符来访问文件,文件描述符大于等于0,是一个用户描述被打开文件的索引值,它指向该文件的相关信息记录表,当文件打开或者创建新文件的时,就会返回一个文件描述符,当读写文件时,也需要使用文件描述符来指定特写文件。…

Natasha 4.0 探索之路系列(三) 基本的动态编译

相关文章Natasha 4.0 探索之路系列(一) 概况Natasha 4.0 探索之路系列(二) 「域」与插件Natasha 的设计动态编译Roslyn 为开发者提供了动态编译的接口&#xff0c;允许我们以 C# 代码来编写 Emit 或 表达式树生成的程序集&#xff0c;但是完成一个编译需要诸多步骤&#xff0c;…

〖Windows〗Linux的Qt程序源码转换至Windows平台运行,编码的解决

在中国大陆&#xff0c;Windows默认的编码是gb2312&#xff0c;而Linux是UTF8&#xff1b; 多数情况下&#xff0c;把Linux上的程序转换至Windows上运行需要进行编码转换才能正常显示&#xff1b; 而其实大可以不必的&#xff0c;同样&#xff0c;文件使用的依然是UTF-8&#x…

使用WebSocket绕过广告屏蔽插件

2019独角兽企业重金招聘Python工程师标准>>> 现在网络上的广告真的是无所不用其极&#xff0c;在网上冲浪&#xff0c;稍不留神&#xff0c;随时随地都会碰上广告&#xff0c;于是广告屏蔽这个需求&#xff0c;就应运而生了。古语云&#xff0c;道高一尺魔高一丈。今…

linux c头文件#include<sys/types.h>和#include<fcntl.h>头文件总结

#include<sys/types.h>的介绍 是Unix/Linux系统的基本系统数据类型的头文件&#xff0c;含有size_t&#xff0c;time_t&#xff0c;pid_t等类型。linux编程中经常用到的头文件。 clock_t 表示系统时间&#xff08;以时钟周期为单位&#xff09;。   dev_t 用于设备号…

vba怎么安装_学VBA,这些最基础的概念一定要知道

说说VBA的那些事儿VBA是什么&#xff1f;很多使用Excel的人经常会看到这三个字母&#xff0c;那么VBA到底是什么呢&#xff1f;长得神似VB的它到底是干什么的&#xff1f;相信很多人都会有这样的问题&#xff0c;今天就和大家说说有关VBA的那些事儿。1 VBA到底是什么VBA的全称&…

你好骚啊......

1 世贤和品如的结婚照是用当年潘粤明和董洁的结婚照PS的......&#xff08;你好骚啊&#xff09;▼2 还挺有耐心的呢...▼3 这是打算铁定要赢了&#xff01;▼4 请打钱&#xff01;▼5 停车场停猫场&#xff1f;▼6 你的养母&#xff1a;粉红豹、跳跳鱼已上线▼7 这是什么…

演示:使用Sniffer统计与分析流量

演示&#xff1a;使用Sniffer统计与分析流量Sniffer是统计与分析网络数据流量的一个很好的选择。因为Sniffer的“混杂”模式会接收到同一个物理网络内的所有数据帧&#xff0c;无论是广播帧还是发送到一个具体地址的数据帧。如果需要Sniffer监听到所处物理网络不同的数据帧&…

CSS3之阴影

CSS3中新增属性-阴影&#xff0c;可以做出很多漂亮的效果。 文字阴影text-shadow text-shadow属性值的顺序&#xff1a; text-shadow: h-shadow v-shadow blur color; 参数分别表示水平阴影位置&#xff0c;垂直阴影位置&#xff0c;模糊半径&#xff0c;阴影颜色。 一个栗子&a…

推荐搞IT的你读读《软件随想录》

《软件随想录&#xff08;Joel on Software&#xff09;》&#xff0c;这是我多年前看的一本书&#xff0c;也是对我影响很大大的一本书。这不是一本讲软件技术的书&#xff0c;但跟技术强相关&#xff0c;推荐给朋友们读一下。这本书严格来讲&#xff0c;不是作者专门写的书&a…

linux c中的文件描述符与打开文件之间的关系

转载请说明出处&#xff1a;http://blog.csdn.net/cywosp/article/details/38965239 1. 概述在Linux系统中一切皆可以看成是文件&#xff0c;文件又可分为&#xff1a;普通文件、目录文件、链接文件和设备文件。文件描述符&#xff08;file descriptor&#xff09;是内核为了高…

spss练习数据_读硕博,为你推荐5本最实用的SPSS数据统计书

SPSS (Statistical Product and Service Solutions&#xff09;,是由IBM公司所推出的一系列用于统计学分析运算、数据挖掘、预测分析和决策支持任务的软件产品。SPSS的基本功能包括数据管理、统计分析、图表分析、输出管理等等&#xff0c;也有专门的绘图系统&#xff0c;可以根…

她半年内举报了755篇问题论文,专挑中国“下手”?还牵扯到北大副校长.........

全世界只有3.14 % 的人关注了爆炸吧知识是挑刺还是打假&#xff1f;2020年7月23日&#xff0c;海外一家学术打假网站PubPeer曝出北京大学常务副校长、北大医学部主任、中国工程院院士詹启敏25篇论文涉嫌学术造假。这25篇论文的发表时间在1998年至2019年&#xff0c;贯穿詹启敏从…

C#获取用户客户端系统版本设备名称浏览器

先看效果使用Neget引用包UAParser项目的github &#xff1a;https://github.com/ua-parser/uap-csharpusing UAParser;...string uaString "Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 …

ABP vNext微服务架构详细教程——简介

简介该系列文章主要展示ABP vNext框架在微服务架构下的用法&#xff0c;提供一套可落地的技术实现思路&#xff0c;并演示各服务在Kubernetes下的部署方案。基础概念ABP vNext基于ASP.NET Core的应用框架&#xff0c;是.Net主流应用开发框架之一。提供基于模块化的灵活项目模板…

电脑怎么测试硬盘的读写速度_两块硬盘合二为一,电脑读写翻倍?这样的“好事”你必须得了解...

近日&#xff0c;技嘉在旗下顶级的B550 AORUS MASTER主板上做了一次PCIe4.0固态阵列测试&#xff0c;由于该款主板支持3个PCIe4.0的M.2固态硬盘&#xff0c;所以这次的测试为3块PCIe4.0固态组建RAID0&#xff0c;来进行读写测试。常见的PCIe3.0x4的固态硬盘的读写速度一般在250…

C# 动态创建控件时注册Name属性

动态创建控件1. 容器控件 .RegisterName("Name",要注册的控件) //注册控件2. 容器控件 .FindName("Name") as 控件类型 //找到控件并转换成相应类型注意仅通过控件.Name来设置是不能通过FindName来找到控件的&#xff0c;必须注册动态删除控件1. 容器控件…