将你的桌面变成一个雨滴窗口:关于两个有趣的应用的整合

效果图(跳转观看,没声音是因为还没加入雨声,嘿嘿嘿)

https://www.bilibili.com/video/BV1FN411p7gA/?vd_source=26196d535f30438a1f56605823f1412f

DreamScene

https://github.com/he55/DreamScene2

在这个主要是用到几个win32的API,将窗口放到桌面与图标之间

    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);


        /// <summary>
        /// 向桌面发送消息
        /// </summary>
        public static void SendMsgToProgman(out IntPtr programHandle)
        {
            // 桌面窗口句柄,在外部定义,用于后面将我们自己的窗口作为子窗口放入
            programHandle = FindWindow("Progman", null);

            IntPtr result = IntPtr.Zero;
            // 向 Program Manager 窗口发送消息 0x52c 的一个消息,超时设置为2秒
            SendMessageTimeout(programHandle, 0x52c, IntPtr.Zero, IntPtr.Zero, 0, 2, result);

            // 遍历顶级窗口
            EnumWindows((hwnd, lParam) =>
            {
                // 找到第一个 WorkerW 窗口,此窗口中有子窗口 SHELLDLL_DefView,所以先找子窗口
                if (FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", null) != IntPtr.Zero)
                {
                    // 找到当前第一个 WorkerW 窗口的,后一个窗口,及第二个 WorkerW 窗口。
                    IntPtr tempHwnd = FindWindowEx(IntPtr.Zero, hwnd, "WorkerW", null);

                    // 隐藏第二个 WorkerW 窗口
                    ShowWindow(tempHwnd, 0);
                }
                return true;
            }, IntPtr.Zero);
        }
    }

raindrop-fx

https://github.com/SardineFish/raindrop-fx

从这个工程偷学一手webgl下glsl实现雨滴的方法,当然我是直接copy来用的;glsl还是挺复杂的,需要好好学习

整合一个简易版本的“好东西”

源码:本次就不传到git了
https://files.cnblogs.com/files/lenkaset/raindow.rar?t=1695121883&download=true

包含两个工程:

  1. Sigmadx:vs的WPF工程,直接F5就行,使用了WebView2这个包
  2. RaindropEffect2:复制于raindrop-fx,改了改启动方式为vite,yarn && yarn dev就行(之所以叫R...2,是因为在此之前有个R...1,1是学习https://github.com/codrops/RainEffect这个工程的副产物)

其它方式

如果看过之前我这个几年前的文章 仿制shazzam的简单功能,将hlsl转换为WPF中的ShaderEffect,就有办法在纯dotnet环境下实现一个雨滴效果,应该需要研究研究shazzam里面的代码,或者本身就会hlsl的话应该会比较好写出来,而且这种实现应该性能更好,不需要浏览器环境(webview2)

如果想切换GPU,在设置里面切换

posted @ 2023-09-19 19:56  lenkaset  阅读(171)  评论(0编辑  收藏  举报