将你的桌面变成一个雨滴窗口:关于两个有趣的应用的整合
效果图(跳转观看,没声音是因为还没加入雨声,嘿嘿嘿)
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
包含两个工程:
- Sigmadx:vs的WPF工程,直接F5就行,使用了WebView2这个包
- 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,在设置里面切换