当前位置:   article > 正文

windows桌面窗口层次解析以及C语言设置壁纸原理应用_progman窗口分析

progman窗口分析

windows桌面层次

首先要知道windows的桌面是由哪个窗口显示的。打开spy++工具。窗口列表翻到最下面有一个 类名是Progman窗口 标题是Program Manager的窗口。这个窗口下面还有好几个子窗口如下:

Progman窗口及其子窗口

桌面各个窗口层作用是什么

先看下原本的桌面吧,然后把每层窗口关闭,分析各个窗口的作用。

原本的窗口

当我们把SysHeader32窗口去除时会发生什么变化呢,看代码。

为了简单,直接用spy++看出来的窗口句柄,对该窗口进行关闭信息的发送,当这个窗口接收到了这个信号,该窗口就会关闭。在写代码时一定要查找窗口,因为每次电脑开机时,系统会重新分配句柄,所以这个句柄是会变化的,这里只是测试一下,所以就简单用了。

查找窗口句柄使用这个函数FindWindow(classname,windowname)

窗口句柄查看

知道了句柄我们就可以对这个窗口进行通信,能对其操作。

发送信号的函数SendMessage()

SysHeader32窗口

好了,知道了这些,我们可以对各个窗口发送关闭信号试试。

  1. #include <Windows.h>
  2. int main() {
  3. SendMessage(HWND(0x000101B2), WM_CLOSE,0,0);//向窗口发送close信号
  4. return 0;
  5. }

执行这段代码后结果是 (执行完F5刷新一下)

关闭SysHeader32窗口后

发现图标下面的名字不见了。所有这个窗口就是显示图标名字的。

FolderView窗口

接下来再关闭一个窗口试试 只需要改下窗口句柄其他的不用变 执行一下

  1. #include <Windows.h>
  2. int main() {
  3. SendMessage(HWND(0x000101AE), WM_CLOSE,0,0);
  4. return 0;
  5. }

发现图标没有了,所以这个窗口是显示图标的还有图标的一系列操作。并且可以发现现在鼠标在桌面上无法进行操作。

因此可以猜测:桌面有一个背景窗口,然后在背景窗口上覆盖了一个图标窗口,在图标窗口上有一个显示图标名字的窗口。覆盖在背景窗口上的窗口是透明的,所以我们可以看到背景的图案,但是没有设置鼠标穿透,所以当我们删掉这个图标窗口时原本的在桌面上的鼠标操作无效了。

SHELLDELL_DefView窗口

再删一个试试。改一下窗口句柄再执行下那个代码,发现并没有什么效果,目前我也不知道它有什么用 但这不重要。我大胆的猜测一下,可能这个窗口就是管理壁纸的窗口,但是当我前面的窗口删掉了无法进行刷新,所以壁纸没有去除。大胆猜测,也不知道是不是对的。

Program Manager窗口

删掉Program Manager的窗口试试

当执行删除代码时会出现这个关机窗口,说明这个窗口是管理窗口,桌面最底层的窗口,关掉了就没了

桌面壁纸原理

我们自己做一个窗口,把自己做的窗口放置在最底层的Program Manager上面。把自己做的窗口设置为它的子窗口,自然就到了它的上面,因为图标层的窗口是透明的。因此在自己的窗口上放显示什么,桌面就可以看到什么。

动态壁纸实现

按照上面的逻辑。应该可以实现。但是有一个视频播放到我们创建的窗口上去时,只会出现刚设置时的那一刻画面。不会播放视频。(可能是Program Manager不会自动刷新,也没必要因为如果是单张的图片的话,没必要刷新)windows自带的设置壁纸好像只能是图片不能是视频(小声我也不确定)。

因此需要想一个办法让窗口会一直刷新

意外得知。如果我们将Program Manager下的子窗口全部给别的窗口管理,Program Manager就不剩子窗口了。这个时候再设置为它的窗口,那就会进行刷新

有一个信号可以实现这个功能(神奇的0x052c)

向Program Manager发送这个信号,会进行一个操作 Program Manager会创建一个类名叫workerW的窗口,并把子窗口全部交给它管理

这时再设置动态的窗口就能动了。

结语

后面的都没有示例,旨在让同学们直接敲一下代码实验一下。有了前面的原理基础应该就能写出自己想要的结果吧。加油,现在就开始动手,写一个动态壁纸吧软件吧。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号