资讯详情

资讯详情

为什么lolPing轮盘不挡鼠标?Electron与C++输入钩子架构完整解析

【免费下载链接】lolPingLeague of Legends ping wheel for your Windows desktop. Hold Alt, drag, and ping anywhere, with the original animations and sounds.项目地址https://gitcode.com/gh_mirrors/lo/lolPing点击查看免费下载lolPing 是一款把《英雄联盟》信号Ping轮盘搬到桌面的开源小工具按住 Alt 拖动任意应用、任意显示器上都能呼出带有原版动画和音效的信号轮盘。它最魔法的一点是——轮盘画在鼠标之下却完全不挡鼠标点击照常穿透给桌面上的程序。本文带你拆解这套 Electron C 输入钩子的双层架构。一、先弄清问题普通窗口为什么会挡鼠标如果你用 Electron 画一个半透明的轮盘窗口默认情况下它会成为最顶层的普通窗口鼠标点上去事件被这个窗口吃掉下面的应用收不到点击窗口还会抢焦点、进任务栏体验很糟。所以不挡鼠标要解决两件事画面要飘在所有窗口之上点击要能穿透过去。lolPing 用两个相互配合的机制完成它。二、第一招穿透式覆盖层Overlay覆盖层逻辑集中在 overlayManager.ts每个显示器各开一个独立窗口关键属性有——属性作用transparentframe: false无边框透明窗只看得见内容focusable: falseshowInactive()不抢焦点、不弹任务栏alwaysOnTopscreen-saver级别压在绝大多数应用之上setIgnoreMouseEvents(true)整窗点击全穿透鼠标事件直接落到下面的程序也就是说轮盘本身从头到尾就是看不见摸不着的贴图用户怎么点都不会被它拦截。还有一个很细的彩蛋窗口高度比显示器矮 1 个 DIP。因为 Windows 会把完全盖住整块屏幕的可见窗口当成全屏应用导致任务栏被压到后面、自动隐藏任务栏失灵矮 1 个像素后就不会触发这个判断了。三、第二招C 输入钩子替 Electron看门既然窗口不响应鼠标那按住 Alt 拖动就开轮盘这件事谁来管答案是 native/hook-helper/ 里那个不到 1 MB 的独立 C 进程hook-helper.exe。为什么必须用 C 而不是在 Electron 里做设计文档 docs/design.md 里写得很直白只有低层钩子WH_MOUSE_LL/WH_KEYBOARD_LL才能吞掉事件让下面的应用看不到这次 Alt拖动Node 的全局钩子库只能旁听无法拦截Windows 会静默摘除响应太慢的低层钩子。Electron 主线程繁忙GC 停顿、窗口创建钩子回调一旦超时就前功尽弃独立小进程跑在自己的专用线程上微秒级应答与渲染进程彻底隔离实现见 hooks_win.cpp。状态机决定每个事件放行还是吞掉真正的大脑是 decision.cpp 里的纯逻辑状态机只有三个状态Idle空闲一切输入原样放行Pending按住触发键 按下左键但还没拖过阈值吞掉这次按下记录起点Wheel轮盘已打开把移动坐标上报松开左键时吞掉释放事件——这样下面的应用不会收到一个没按下就松开的幽灵点击。它有几条保证体验的硬规则场景处理方式按住 Alt 但没拖动就松手把 downup原样重放给系统普通 Alt点击快捷键不受影响右键 / Esc / 点回中心发送cancel轮盘取消Alt 松开前插入一个遮罩键VK_NONAME阻止 Windows 弹出菜单栏AutoHotkey 同款技巧10 秒无鼠标事件的看门狗自动取消手势防止卡死全屏游戏窗口检测到点击落在全屏应用上时全部放行游戏保留每一次点击四、JSON 行协议两个进程间的对讲机Electron 与 C 进程之间不复杂、零依赖走stdin/stdout 的 JSON 行协议在 protocol.ts 中单点定义Electron → helperstdinconfig触发键、拖拽阈值、是否启用等、setEnabled、suspend录入快捷键期间全部放行、shutdownhelper → ElectronstdoutwheelOpen{x,y}、wheelMove{x,y}、wheelRelease{x,y}、click、cancel、toggled等事件。管理这一层的 inputBridge.ts 负责解析 JSON 行、配置变更即下发并按 0.5s → 1s → 2s 的退避策略自动重启崩溃的 helper60 秒内崩 3 次则停止托盘变警告色并弹提示。反过来如果 Electron 自己挂掉stdin 关闭helper 会立即解除钩子退出——输入永远不会被劫持到失联。五、架构小结Electron 主进程 ├─ InputBridge 启动/监管 hook-helper.exeJSON 行通信 ├─ OverlayManager 每显示器一个透明穿透覆盖层 └─ 托盘 / 设置窗口React Fluent UI ▲ stdout: 输入事件 ▼ stdin: 配置指令 hook-helper.exeC / Win32 低层钩子专用线程一句话总结Electron 负责画每屏一个全穿透覆盖层C 钩子负责听微秒级判断每个鼠标键盘事件是放行还是拦截。两层各司其职轮盘自然既不挡鼠标、也不干扰系统。想继续深入推荐阅读 docs/design.md 的完整设计规格以及 native/hook-helper/tests/ 中针对状态机的 C 单元测试几乎覆盖了你日常会用到的每种手势边界情况。赞分享【免费下载链接】lolPingLeague of Legends ping wheel for your Windows desktop. Hold Alt, drag, and ping anywhere, with the original animations and sounds.项目地址https://gitcode.com/gh_mirrors/lo/lolPing点击查看免费下载相关推荐为什么Terminal.Gui的鼠标支持这么强从点击事件到鼠标抓取的完整解析为什么Terminal.Gui的鼠标支持这么强从点击事件到鼠标抓取的完整解析 Terminal.Gui 是一个跨平台的 .NET 终端 UI 工具包让开发者UI组件跨平台桌面应用探索鼠标键盘钩子库MouseKeyHook探索鼠标键盘钩子库MouseKeyHook 项目介绍 MouseKeyHook 是一个强大的 .NET 库专为 Windows 平台设计允许开发者捕获和记为什么你的macOS中文输入体验需要彻底升级鼠须管输入法完全解析为什么你的macOS中文输入体验需要彻底升级鼠须管输入法完全解析 还在忍受macOS上中文输入的种种不便吗卡顿、词库不全、界面丑陋这些问题是否已经成为你工桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →