爱收集资源网

将桌面置于窗口下方,打造炫酷动态桌面

网络 2023-06-24 16:04

WPF将窗口放在桌面下方(可用于动态桌面)

先来看一下疗效:

界面元素很简单,就一个Button按键,之后写个定时器,定时更新Button按键中的内容为当前时间,下边来介绍下原理,和界面组成。

窗口介绍

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

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

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

来演示一下怎样查找窗口,点击上方白色框中的查找窗口按键,两个随意选一个,会弹出如下窗口:

之后你点击蓝色区域中的这个控件拖动到你想获取的信息窗口,还能见到当前窗口的详尽信息了,包括窗口的句柄、标题、类。

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

桌面双击图标图标消失_怎么样才能让桌面图标_win10开机速度慢 到桌面要很久才能响应

这儿我们关闭这个窗口,回到Spy++的主界面,拖到最顶部:

可以看见,ProgmanManager是桌面窗口的父窗口,上面小窗口图标是红色的表示的是此窗口是隐藏的(子窗口拥有和父窗口一致的显示层级)。

原理操作

如今,我们只须要把我们的界面,也就是放在ProgramManager下边,之后再适当调整它的显示次序,就可以了,而且这一块我们不好操作。有一个其他路子就是给窗口发送一个特殊的消息,来让我们有操作的空间。

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

怎么样才能让桌面图标_win10开机速度慢 到桌面要很久才能响应_桌面双击图标图标消失

下边是早已发送过此消息后的样子:

可以看见ProgramManager下边早已哪些都没有了,内容全都转移到第一个WokerW窗口下,这时侯我们只须要将我们的窗口挂在到ProgramManager窗口的下方能够又有和它一样的显示层级了(窗口从下到上依次显示,所以这儿ProgramManager显示在最底层),不过须要注意的是,在ProgramManager和第一个WorkerW窗口之间,还存在另外一个WorkerW窗口,在我的系统中,它默认隐藏了,为了确保疗效一致,我们须要自动将它隐藏上去。

具体操作

窗体的部份很简单,就创建个窗体,带一个按键,设置一些窗口基本的信息,截个代码:

代码部份也贴一下吧(复制代码注意你的命名空间):

怎么样才能让桌面图标_桌面双击图标图标消失_win10开机速度慢 到桌面要很久才能响应


    

之后呢就是后台的代码的部份,获取窗口信息,查找窗口和向桌面窗口发送消息0x52C,须要用到一些Win32的API,下边直接列下来。

    //Win32方法
    public static class Win32Func
    {
        [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);
    }

下边的代码就是向窗口发送消息,但是隐藏中间WorkerW窗口的方式:

        /// 
        /// 向桌面发送消息
        /// 
        public void SendMsgToProgman()
        {
            // 桌面窗口句柄,在外部定义,用于后面将我们自己的窗口作为子窗口放入
            programHandle = Win32Func.FindWindow("Progman", null);
            IntPtr result = IntPtr.Zero;
            // 向 Program Manager 窗口发送消息 0x52c 的一个消息,超时设置为2秒
            Win32Func.SendMessageTimeout(programHandle, 0x52c, IntPtr.Zero, IntPtr.Zero, 0, 2, result);
            // 遍历顶级窗口
            Win32Func.EnumWindows((hwnd, lParam) =>
            {
                // 找到第一个 WorkerW 窗口,此窗口中有子窗口 SHELLDLL_DefView,所以先找子窗口
                if (Win32Func.FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", null) != IntPtr.Zero)
                {
                    // 找到当前第一个 WorkerW 窗口的,后一个窗口,及第二个 WorkerW 窗口。
                    IntPtr tempHwnd = Win32Func.FindWindowEx(IntPtr.Zero, hwnd, "WorkerW", null);
                    // 隐藏第二个 WorkerW 窗口
                    Win32Func.ShowWindow(tempHwnd, 0);
                }
                return true;
            }, IntPtr.Zero);
        }

之后在MainWindow的构造函数中调用下就行了:

        public MainWindow()
        {
            InitializeComponent();
            //向桌面发送消息
            SendMsgToProgman();
        }

桌面双击图标图标消失_win10开机速度慢 到桌面要很久才能响应_怎么样才能让桌面图标

最后贴一下页面Button的Click方式:

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // 设置当前窗口为 Program Manager的子窗口
            Win32Func.SetParent(new WindowInteropHelper(this).Handle, programHandle);
            //设置button背景色为透明
            btnTime.Background = new SolidColorBrush(Colors.Transparent);
            //设置当前界面的宽高,因为我是双屏,所以不能设置全屏,就以这种方式来设置界面了
            this.Width = 1920;
            this.Height = 1080;
            this.Left = 0;
            this.Top = 0;
            //启动定时器,更新Button按钮中的内容
        }

关于改变Button按键中内容的定时器,这儿就不贴了,随便发挥自己的想像吧!

简单心得

既然可以把当前的界面放置到桌面图标的下方,这么在界面中可以设置一些愈发好玩的疗效,例如播放一个视频,这就是我们的动态桌面了,要是再有点奇思妙想,弄个科技桌面,或则简单粗鲁做个美国小方块,也不是不可以!自由发挥!

又水一篇!

哈哈!

怎么样才能让桌面图标
上一篇:Dell服务器系统重装全流程 下一篇:没有了
相关文章