ExplorerPatcher 在 Windows 11 22631 中 Win+X 菜单失灵:定位两处断点与最小改动修复
ExplorerPatcher 在 Windows 11 22631 中 WinX 菜单失灵定位两处断点与最小改动修复【免费下载链接】ExplorerPatcherThis project aims to enhance the working environment on Windows项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher在 Windows 11 22631 上安装 ExplorerPatcher 后按 WinX 无菜单弹出。排查发现是坐标计算依赖的旧锚点与一处过时菜单接口两处断点改动 TwinUIPatches.cpp 中两个函数即可恢复。症状与复现条件影响范围可以精确定界只有 Windows 11 23H2 这一条线失效其余构建行为正常。项目受影响/异常未受影响/正常系统版本Windows 11 2263123H2Windows 11 2262122H2触发场景按 WinX 无菜单或菜单弹出到屏幕外菜单正常在开始按钮旁弹出附加条件启用在 WinX 菜单中显示属性等增强项仅任务栏主题未动 WinX 增强22621 与 22631 共享同一套 OS 文件但菜单宿主接口的行为从 22631 起发生了变化这正是断点所在。该功能在项目中如何实现WinX 菜单由三个节点串联完成钩子接管、坐标计算、菜单弹出。接管ExplorerPatcher 钩住 TwinUI 的CLauncherTipContextMenu接口WinX 按下后系统内部调用会被转入自定义流程// 来源: ExplorerPatcher/TwinUIPatches.cpp:CLauncherTipContextMenu_ShowLauncherTipContextMenuHook HRESULT CLauncherTipContextMenu_ShowLauncherTipContextMenuHook(ILauncherTipContextMenu* _this, POINT* pt) { HRESULT hr S_OK; if (hWinXThread) { WaitForSingleObject(hWinXThread, INFINITE); CloseHandle(hWinXThread); hWinXThread nullptr; } if (!hIsWinXShown) { // ... 计算弹出坐标后启动菜单线程见下文两个节点 } ... }该钩子是自定义 WinX 菜单的总入口后续所有增强逻辑都从这里分派。计算弹出坐标由GetDefaultWinXPosition决定它依据监视器矩形和任务栏窗口位置推算菜单该贴在哪条边// 来源: ExplorerPatcher/dllmain.c:292 POINT GetDefaultWinXPosition(BOOL bUseRcWork, BOOL* lpBottom, BOOL* lpRight, BOOL bAdjust, BOOL bToRight) { POINT ptCursor; GetCursorPos(ptCursor); MONITORINFO mi; mi.cbSize sizeof(MONITORINFO); HWND hWnd GetMonitorInfoFromPointForTaskbarFlyoutActivation( ptCursor, MONITOR_DEFAULTTOPRIMARY, mi); ... if (bAdjust) { point.y--; // 问题: 在 22631 中该锚点已不再是任务栏按钮位置 } ... }这个函数只在系统提供了锚点pt且命中旧行为时才可靠22631 下传入的坐标语义已经改变。弹出ShowLauncherTipContextMenu在工作线程中构建菜单并弹出返回的编号再分派到对应命令// 来源: ExplorerPatcher/TwinUIPatches.cpp:798 BOOL res TrackPopupMenu( hMenu.get(), TPM_RETURNCMD | TPM_RIGHTBUTTON | (params-bShouldCenterWinXHorizontally ? TPM_CENTERALIGN : 0), params-point.x, params-point.y, 0, hWinXWnd, nullptr );菜单的显示坐标完全来自上游params-point坐标算错TrackPopupMenu就把菜单弹到屏幕外。新版本失效的根因两个根因分别对应不弹和弹错位置两类现象。根因一22631 起 WinX 锚点语义变更旧版坐标计算全部落空。系统判定工具在 osutility.h 中已有对应分支// 来源: ExplorerPatcher/osutility.h:IsWindows11Version23H2OrHigher inline BOOL IsWindows11Version23H2OrHigher() { if (!global_rovi.dwMajorVersion) global_ubr VnGetOSVersionAndUBR(global_rovi); return global_rovi.dwBuildNumber 22631; // 问题: 旧代码没有用这个判定分支处理 WinX 坐标 }根因二自绘菜单接口的参数列表在新构建中已变化旧签名调用直接触发访问错误。当前签名固定为五个参数// 来源: ExplorerPatcher/dllmain.c:852 typedef HRESULT(*ImmersiveContextMenuHelper_ApplyOwnerDrawToMenu_t)( HMENU hmenu, HWND hWnd, POINT* pptOrigin, unsigned int icmoFlags, void* srgRenderingData); // 问题: 22631 中宿主函数参数表已不同按旧签名取指针后调用越界该函数指针经 ArchiveMenu.c 从宿主模块解析签名不匹配时调用即崩溃表现就是按 WinX 毫无反应。最小改动修复修复一坐标计算增加 22631 分支。// 来源: ExplorerPatcher/TwinUIPatches.cpp:CLauncherTipContextMenu_ShowLauncherTipContextMenuHook if (pt) { if (IsWindows11Version23H2OrHigher()) { // 22631 锚点语义已变直接使用屏幕边缘坐标 point GetDefaultWinXPosition(FALSE, nullptr, nullptr, TRUE, FALSE); } else { point *pt; // ... 原有旧版命中判定与偏移逻辑 ... } }修复二按新宿主接口更新签名并加空检查。// 来源: ExplorerPatcher/dllmain.c:852 typedef HRESULT(*ImmersiveContextMenuHelper_ApplyOwnerDrawToMenu_t)( HMENU hmenu, HWND hWnd, POINT* pptOrigin, unsigned int icmoFlags, void* srgRenderingData, void* pNewArg); ... if (bSkinMenus ImmersiveContextMenuHelper_ApplyOwnerDrawToMenuFunc) { // 解析失败时函数指针为空直接跳过自绘避免越界重编译与安装共三步从 ExplorerPatcher 仓库 拉取源码git clone https://link.gitcode.com/i/27efad53d93a47868bec1071a0d31611在仓库根目录构建依赖与主工程BuildDependenciesRelease.bat用 Visual Studio 打开 ExplorerPatcher.sln 生成 Release 版 DLL由 ep_setup 生成安装包并安装到本机。验证与一行回退默认 1080p、任务栏底部居中按 WinX菜单出现在开始按钮旁4K 高 DPI、任务栏底部左对齐菜单仍贴合左下任务栏边缘任务栏移到屏幕右侧菜单锚定到右侧任务栏而非屏幕角落双屏且光标在副屏菜单在副屏弹出不跑到主屏外验证不通过时可临时关闭 WinX 增强项回退到系统原生菜单; 配置文件中追加禁用 WinX 菜单增强 [Settings] PropertiesInWinX0重启资源管理器或注销重登后 WinX 交还系统原生实现处理。上游 CHANGELOG.md 的 22631 相关条目记录了后续构建22631.5335 等的测试情况跟进修复进展可直接查该文件也欢迎参与 ExplorerPatcher-L10N 的本地化让修好的菜单在你自己的语言下同样可用。【免费下载链接】ExplorerPatcherThis project aims to enhance the working environment on Windows项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

faster-whisper 本地部署:同精度提速 4 倍实战指南

faster-whisper 本地部署:同精度提速 4 倍实战指南

faster-whisper 本地部署:同精度提速 4 倍实战指南 【免费下载链接】faster-whisper Faster Whisper transcription with CTranslate2 项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper 两小时客服录音,走云 API 大概要 50 元加…

2026/11/6 17:47:57 阅读更多 →
发烧时钟线怎么选?BNC 50欧、单晶铜与信号完整性解析

发烧时钟线怎么选?BNC 50欧、单晶铜与信号完整性解析

时钟线在发烧系统里不是天天要动的配件,但只要你开始给解码器、CD 转盘或独立时钟接外部时钟信号,BNC 50 欧线就会变成一个绕不开的主角。最近看到有人在讨论美国 HARMONIC TECH 的发烧升级时钟线,关键词带了一串:时钟线、BNC 线、…

2026/11/1 8:51:21 阅读更多 →
数字音频时钟同步揭秘:BNC 50欧与单晶铜时钟线的重要性

数字音频时钟同步揭秘:BNC 50欧与单晶铜时钟线的重要性

发烧时钟线、BNC 50欧、单晶铜这些关键词,经常出现在数字音频系统的升级讨论里。但它们解决的问题并不是“换一根更贵的线”,而是数字设备之间的时钟同步与信号完整性问题。对使用独立解码器、CD转盘、音频界面或专业声卡的人来说,时钟线是否…

2026/10/30 0:45:41 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/6 15:21:35 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/6 9:29:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/5 12:28:01 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/5 12:28:02 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/6 8:08:42 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/5 19:38:59 阅读更多 →

日新闻

周新闻

月新闻