NoFences的Win32魔法:4行代码让窗口粘在桌面上永不抢焦点
NoFences的Win32魔法4行代码让窗口粘在桌面上永不抢焦点【免费下载链接】NoFences Open Source Stardock Fences alternative项目地址: https://gitcode.com/gh_mirrors/no/NoFencesNoFences是一个免费开源的桌面文件夹工具可看作 Stardock Fences 的平替把桌面图标收进一个个围栏里桌面立刻清爽。而它最迷人的地方是几行Win32 API调用——总共不到 4 行代码就能让窗口粘在桌面上并且永不抢走焦点。今天就带你拆解这套Win32魔法新手也能看懂。认识 NoFences免费的桌面文件夹神器商业软件 Stardock Fences 售价 11 欧元项目作者一句话概括了动机没想付这个钱所以自己写了一个。NoFences 用 C# WinForms 实现功能却很完整 创建/删除围栏文件夹把快捷方式拖进去即可收纳 支持拖拽移动、四角拉伸、滚轮缩放不锁定时随手操作 鼠标移开自动最小化成标题条移入展开 毛玻璃背景 阴影视觉上完全融入桌面所有围栏由单例 FenceManager 统一调度配置以 XML 序列化保存在每个围栏目录中。而像桌面图标一样安静地待在桌面这个体验来自下面两个小技巧。魔法一2行代码把窗口粘到桌面Windows 的桌面本身就是一个窗口窗口类名叫Progman。只要把自家窗口的父窗口改成桌面窗口就拥有了桌面图标的体质——它属于桌面而不是普通应用窗口。看 DesktopUtil.cs 里的GlueToDesktop方法核心就是2 行IntPtr nWinHandle FindWindowEx(IntPtr.Zero, IntPtr.Zero, Progman, null); SetWindowLongPtr(handle, GWL_HWNDPARENT, nWinHandle.ToInt32());第 1 行FindWindowEx按类名找到桌面窗口 Progman 的句柄第 2 行通过SetWindowLong写入GWL_HWNDPARENT把围栏窗口的父窗口设为桌面效果等同于SetParent。顺带一提同文件里的PreventMinimize也能一行去掉窗口的最大化/最小化按钮让围栏只可收纳、不可收进任务栏。魔法二2行代码让窗口永不抢焦点粘在桌面还不够——你正在写代码手一抖碰到了围栏窗口就被激活、抢到最上层谁都不爽。解法在 FenceWindow.cs 的WndProc消息循环里拦截WM_SETFOCUS消息抢在系统激活窗口之前把自己压回最底层if (m.Msg WM_SETFOCUS) { SetWindowPos(Handle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); return; }拆开看这 2 行的机关HWND_BOTTOM把窗口放到 Z 序最底永远压在普通窗口之下SWP_NOACTIVATE只改位置层级、不激活窗口焦点纹丝不动地留在你原来的程序上SWP_NOSIZE | SWP_NOMOVE尺寸和位置一个像素都不变。相关常量都在 WindowUtil.cs 中定义。加上魔法一4 行代码的标题名副其实2 行粘桌面 2 行不抢焦。彩蛋让围栏从 AltTab 列表里隐身围栏不是应用不该出现在 AltTab 里。WindowUtil.cs 的HideFromAltTab用同样 2 招办到先SetWindowPos压底再给窗口加一个WS_EX_TOOLWINDOW扩展样式——这是 Windows 约定俗成的工具窗口标记AltTab 会直接忽略它。其它 Win32 小魔法围栏安静的质感还靠几个点缀效果实现要点源码位置 毛玻璃背景SetWindowCompositionAttributeACCENT_ENABLE_BLURBEHINDBlurUtil.cs 无边框圆角阴影DWM 接口DwmExtendFrameIntoClientAreaDropShadow.cs✂ 去掉系统边框WndProc拦截0x0083WM_NCCALCSIZE消息FenceWindow.cs 右键菜单复用系统 Shell 上下文菜单ShellContextMenu.cs 图标缩略图独立后台线程生成不卡 UIThumbnailProvider.cs窗口创建时的装配顺序也值得一看FenceWindow.cs先上阴影、再开模糊、再隐身 AltTab、最后粘上桌面——四步走完一个桌面原生的围栏就诞生了。动手看看源码全部 Win32 封装集中在 NoFences/Win32/ 目录每个文件都只有几十到一百来行注释清晰是非常好的 Win32 API 入门读物粘桌面DesktopUtil.cs压层级/隐身WindowUtil.cs消息拦截总控FenceWindow.cs下次当你想让某个小工具窗口安分守己地贴在桌面上时记住这套组合拳就行找到 Progman 换父窗口拦截 WM_SETFOCUS 压回底层。4 行代码Win32 的魔法就这么简单。【免费下载链接】NoFences Open Source Stardock Fences alternative项目地址: https://gitcode.com/gh_mirrors/no/NoFences创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考