Electron实现跨窗口鼠标事件监听:从浏览器到系统级的解决方案
1. 为什么我们需要监听“窗口外”的鼠标你可能已经习惯了在网页里用addEventListener来监听鼠标的点击、移动一切都那么自然。但当你开始用 Electron 构建一个桌面应用时一个全新的、有点“越界”的需求就冒出来了我想知道用户在整个电脑屏幕上做了什么哪怕鼠标根本没在我的应用窗口里这听起来是不是有点“偷窥”的嫌疑别误会这背后其实有很多正经且强大的应用场景。我举个我亲身经历的例子几年前我帮一个设计团队开发一个“全局取色器”工具。用户需要把鼠标移到屏幕任何地方比如一个网页、一张图片、甚至系统桌面上点击一下就能获取那个像素点的颜色值。如果我的 Electron 窗口只能监听自己内部的点击那这个工具就废了。我必须能“看到”整个屏幕的鼠标动作。再比如你想做一个全局的快捷操作面板当鼠标移动到屏幕边缘时自动弹出或者做一个屏幕录制工具需要精确知道录制开始和结束的点击位置甚至是一个辅助工具需要根据用户的全局鼠标行为做出响应。这些场景都要求你的 Electron 应用能“突破”浏览器窗口的边界去感知系统级的鼠标事件。这就是我们今天要啃的硬骨头。Electron 的核心是 Chromium它天生就是个“浏览器”安全沙箱把它限制在自己的窗口内。直接调用window.addEventListener(click, ...)是绝对监听不到窗口外事件的。所以我们必须借助 Node.js 的能力去调用操作系统底层的接口也就是所谓的“系统级”或“全局”鼠标钩子。这条路听起来很酷但坑也不少涉及到不同操作系统的差异、权限问题、性能影响等等。别担心我会带你一步步走通从最简单的方案到最复杂的系统级监听把每个方案的优缺点和适用场景都讲透。2. 方案一使用 robotjsWindows 的利器如果你主要面向 Windows 用户那么robotjs这个库可以说是你的首选。它最初是为了模拟鼠标键盘操作自动化而生的但反过来它也能非常稳定地捕获全局的鼠标事件。我最早用它来做自动化测试脚本后来发现用来做全局监听也相当靠谱。2.1 安装与基础配置首先在你的 Electron 项目里安装它npm install robotjs这里有个小坑我踩过robotjs是一个原生模块Native Addon这意味着它包含了需要编译的 C 代码。所以如果你的 Electron 版本和robotjs编译时使用的 Node.js 版本不匹配很可能会安装失败。最稳妥的办法是使用electron-rebuild来针对你的 Electron 版本重新编译它。npm install --save-dev electron-rebuild然后在你的package.json的脚本里添加scripts: { rebuild: electron-rebuild }安装完robotjs后运行一次npm run rebuild。这能确保原生模块和你的 Electron 环境完美兼容。2.2 实现全局点击监听安装配置好后监听全局鼠标点击的代码其实非常直观const robot require(robotjs); // 设置鼠标事件检测的灵敏度单位是毫秒 robot.setMouseDelay(10); // 监听鼠标点击事件 robot.on(mouseclick, (x, y, button) { console.log([全局点击] 坐标: (${x}, ${y}), 按键: ${button}); // button: 1-左键, 2-中键, 3-右键 }); // 你还可以监听鼠标移动但注意全局移动事件非常频繁要小心性能 robot.on(mousemove, (x, y) { // 生产环境慎用日志会刷屏 // console.log(鼠标移动到: (${x}, ${y})); }); // 监听鼠标按键按下和抬起 robot.on(mousedown, (x, y, button) { console.log([按键按下] 按键: ${button} 在 (${x}, ${y})); }); robot.on(mouseup, (x, y, button) { console.log([按键抬起] 按键: ${button} 在 (${x}, ${y})); });把这段代码放在你的主进程main process里运行起来。现在即使你把 Electron 窗口最小化或者鼠标在记事本、浏览器上点击控制台都会哗哗地打印出日志。是不是有种“上帝视角”的感觉2.3 实战实现一个简易全局取色器光说不练假把式我们用它来实现开头说的那个取色器功能。思路是监听全局点击当点击发生时获取点击位置的屏幕像素颜色。const robot require(robotjs); const { ipcMain, BrowserWindow } require(electron); let pickerWindow; // 假设这是我们取色器的窗口 robot.setMouseDelay(50); // 取色器不需要那么高的灵敏度避免误触发 robot.on(mouseclick, (x, y, button) { // 假设我们只关心左键点击 if (button 1) { // 关键一步获取屏幕上指定坐标的颜色 const hexColor robot.getPixelColor(x, y); console.log(在 (${x}, ${y}) 取到颜色: #${hexColor}); // 将颜色信息发送给渲染进程在UI上显示 if (pickerWindow !pickerWindow.isDestroyed()) { pickerWindow.webContents.send(color-picked, { x, y, color: #${hexColor} }); } // 可选在点击位置显示一个短暂的提示框需要自己创建另一个透明窗口 // showColorTip(x, y, hexColor); } }); // 在渲染进程比如 preload.js 或渲染器脚本中接收颜色 // ipcRenderer.on(color-picked, (event, {x, y, color}) { // document.getElementById(colorDisplay).textContent 颜色: ${color}; // document.getElementById(coordinates).textContent 位置: (${x}, ${y}); // });需要注意的坑权限问题在 macOS 和某些 Linux 发行版上访问屏幕像素需要辅助功能权限Accessibility。在 Windows 上通常也需要应用以管理员权限运行才能捕获某些系统区域的像素。如果getPixelColor返回黑色或错误首先检查权限。性能robotjs的mousemove事件是全局的频率极高。如果你真的需要监听移动比如做鼠标轨迹绘制一定要做节流throttle处理否则 CPU 占用会飙升。跨平台局限robotjs虽然也支持 macOS 和 Linux但在这些平台上捕获全局事件的行为和稳定性可能不如 Windows。对于跨平台要求高的项目它可能不是最优雅的解决方案。3. 方案二拥抱跨平台库 global-mouse-events如果你的应用需要同时支持 Windows、macOS 和 Linux那么专门为跨平台全局鼠标事件而生的库会是更好的选择。global-mouse-events就是这样一个库它封装了各平台底层的原生 API提供了一致的 JavaScript 接口。3.1 安装与快速上手安装同样简单npm install global-mouse-events它的 API 设计得非常简洁基本上就是“开始监听”和“停止监听”const { startMonitoring, stopMonitoring } require(global-mouse-events); // 启动全局监听 const stopListener startMonitoring((event) { console.log(全局鼠标事件:, event); }); // event 对象通常包含 // - name: 事件类型如 mousedown, mouseup, mousemove, wheel // - x: 鼠标X坐标 // - y: 鼠标Y坐标 // - button: 按键 (0:左键, 1:中键, 2:右键) // - deltaX/deltaY: 滚轮事件增量 // 在应用退出或需要停止时调用返回的函数来停止监听 // stopListener();实测下来这个库在三大主流桌面操作系统上都能工作省去了你自己去折腾Windows Hook、CGEventTap(macOS)、XInput(Linux) 的麻烦。对于大多数“我需要知道用户点了哪里”的需求它已经足够了。3.2 深入事件对象与高级用法我们来看看一个典型的事件对象里有什么以及如何处理复杂场景const { startMonitoring } require(global-mouse-events); const unsubscribe startMonitoring((event) { switch (event.name) { case mousedown: console.log(按键按下: ${getButtonName(event.button)} 在 [${event.x}, ${event.y}]); // 可以在这里开始一个拖拽操作的记录 break; case mouseup: console.log(按键抬起: ${getButtonName(event.button)}); // 结束拖拽操作执行相应逻辑 break; case mousemove: // 重要全局鼠标移动事件每秒可能触发数百次 // 一定要做节流比如每50ms处理一次 if (shouldThrottle()) { console.log(鼠标移动: [${event.x}, ${event.y}]); // 更新UI上的鼠标位置指示器等 } break; case wheel: console.log(滚轮: deltaX${event.deltaX}, deltaY${event.deltaY}); // 可以实现全局滚轮控制音量、缩放等功能 break; } }); function getButtonName(code) { const map { 0: 左键, 1: 中键, 2: 右键 }; return map[code] || 未知按键(${code}); } // 一个简单的节流函数实现 let lastMoveTime 0; function shouldThrottle(interval 50) { const now Date.now(); if (now - lastMoveTime interval) { lastMoveTime now; return true; } return false; }与 robotjs 的对比特性robotjsglobal-mouse-events主要用途模拟与捕获输入专为全局事件捕获设计跨平台一致性较好但事件模型可能略有差异优秀API完全统一额外功能屏幕取色、像素读取、键盘事件纯事件监听安装复杂度需要编译可能需electron-rebuild纯JS或预编译二进制通常更简单推荐场景Windows深度集成、需要取色功能纯跨平台全局事件监听简单来说如果你只需要“监听事件”选global-mouse-events更省心。如果你还需要“读取屏幕”或进行复杂的输入模拟robotjs功能更强大。3.3 权限与打包注意事项使用这些全局监听库最大的挑战往往不是代码而是系统权限和应用分发。macOS这是最“严格”的。你的应用必须在“系统偏好设置” - “安全性与隐私” - “辅助功能”中获得明确的授权。否则监听会完全失效。在开发时系统会弹窗提示对于分发给用户的最终成品你需要在Info.plist文件中声明相关权限并可能需要进行公证Notarization。Windows在最新版本的 Windows 10/11 上特别是当你的应用尝试监听以管理员权限运行的程序或某些安全桌面的输入时可能也需要提升权限以管理员身份运行。Linux取决于桌面环境如 GNOME, KDE可能需要访问X11或Wayland的相应接口通常也需要用户授权。打包建议 在打包你的 Electron 应用使用electron-builder或electron-packager时务必在配置文件中正确声明这些权限。例如在electron-builder的配置中{ build: { appId: com.yourcompany.yourapp, mac: { category: public.app-category.utilities, entitlements: build/entitlements.mac.plist, // 包含辅助功能权限的plist文件 extendInfo: { NSAppleEventsUsageDescription: 需要此权限来监听全局鼠标事件以提供XX功能。 } }, win: { requestedExecutionLevel: highestAvailable // 可能需要请求更高权限 } } }4. 方案三巧用 Electron 原生 API 的边界方案也许你并不需要真正的“全屏幕无死角”监听你的需求可能只是“稍微超出一点窗口边界”或者与“窗口状态”强相关。这时完全依赖外部原生库可能有点杀鸡用牛刀我们可以看看 Electron 自身提供的一些 API 能否曲线救国。4.1setIgnoreMouseEvents与透明窗口这是一个非常有趣的特性。BrowserWindow的setIgnoreMouseEvents(ignore, options)方法本意是让窗口忽略所有鼠标事件使点击能穿透到下方的窗口。但我们可以结合透明窗口玩出一些花样。场景你想做一个始终置顶的、半透明的“工具栏”或“悬浮球”当鼠标移上去时它正常交互当鼠标移出时它允许你点击到后面的内容但同时它又想“知道”你在后面点击了什么虽然做不到真正的像素级监听但可以知道点击发生了。const { BrowserWindow, screen } require(electron); function createOverlayWindow() { const { width, height } screen.getPrimaryDisplay().workAreaSize; const overlayWin new BrowserWindow({ width: 100, height: 100, x: width - 120, y: 50, frame: false, // 无边框 transparent: true, // 透明背景 alwaysOnTop: true, // 始终置顶 resizable: false, webPreferences: { nodeIntegration: true, contextIsolation: false // 注意安全新项目建议用 preload } }); overlayWin.loadFile(overlay.html); // 关键让窗口默认忽略鼠标事件实现穿透 overlayWin.setIgnoreMouseEvents(true, { forward: true }); // forward: true 参数很重要它允许鼠标消息继续传递。 // 但我们需要在窗口的某些区域比如一个按钮恢复接收事件 // 这通常在渲染进程中通过 IPC 通信来实现切换。 // 例如在 overlay.html 里当鼠标进入一个元素时发送 IPC 消息给主进程 // ipcRenderer.send(set-ignore-mouse-events, false); // 主进程监听并调用 overlayWin.setIgnoreMouseEvents(false); } // 主进程监听IPC ipcMain.on(set-ignore-mouse-events, (event, ignore) { const win BrowserWindow.fromWebContents(event.sender); if (win) { win.setIgnoreMouseEvents(ignore, { forward: true }); } });这个方案无法获取穿透后点击的具体坐标和内容但它实现了一种“选择性穿透”的交互适合做画中画、悬浮助手类应用。4.2globalShortcut的局限性很多初学者会想到globalShortcut模块因为它能注册全局快捷键。但很遗憾它只能监听键盘快捷键不能监听鼠标事件。你不能用它来捕获一个单纯的鼠标点击。它的用处在于你可以定义一个“快捷键组合”比如CtrlShiftC来触发你的全局取色功能但这需要用户主动按下键盘而不是纯粹的鼠标行为。4.3 系统托盘与上下文菜单虽然不直接监听鼠标但如果你需求是“通过鼠标操作触发一个全局菜单”那么系统托盘Tray是 Electron 的绝活。你可以创建一个托盘图标监听图标的点击事件。这个图标位于系统的菜单栏macOS或通知区域Windows/Linux是独立于你的主窗口的。const { app, Tray, Menu } require(electron); const path require(path); let tray null; app.whenReady().then(() { const iconPath path.join(__dirname, assets, trayIcon.png); tray new Tray(iconPath); // 创建托盘图标 const contextMenu Menu.buildFromTemplate([ { label: 显示主窗口, click: () mainWindow.show() }, { label: 全局取色, click: () startColorPicking() }, // 这里可以启动你的全局监听逻辑 { type: separator }, { label: 退出, role: quit } ]); tray.setToolTip(我的全局助手); // 鼠标悬停提示 tray.setContextMenu(contextMenu); // 设置右键菜单 // 监听托盘图标本身的左键点击非所有平台行为一致 tray.on(click, () { mainWindow.isVisible() ? mainWindow.hide() : mainWindow.show(); }); });这个方案的优势是完全原生、无需额外权限通常并且给用户一个明确的系统级入口。它适合作为你全局功能的一个触发点。5. 实战构建一个完整的全局快捷键截图工具让我们把所有知识串联起来设计一个稍微复杂点的例子一个支持全局鼠标拖拽区域截图的工具。它的工作流程是用户按下预设的全局快捷键如CtrlShiftA后屏幕覆盖一层半透明遮罩然后用户用鼠标拖拽选择区域松开鼠标完成截图。5.1 架构设计主进程负责创建和管理各种窗口注册全局快捷键运行原生模块监听。遮罩窗口一个全屏、透明、无边框的窗口用于绘制选择区域和捕获鼠标事件。渲染进程在遮罩窗口中运行用 HTML5 Canvas 绘制选择框并通过 IPC 与主进程通信。原生模块在主进程中使用global-mouse-events或robotjs来可靠地捕获全局鼠标按下、移动、抬起事件并转发给遮罩窗口。5.2 核心代码实现主进程 (main.js) 部分const { app, BrowserWindow, globalShortcut, ipcMain, screen } require(electron); const { startMonitoring } require(global-mouse-events); // 或使用 robotjs const path require(path); let overlayWindow null; let isSelecting false; let startX, startY; function createOverlayWindow() { const displays screen.getAllDisplays(); // 这里简化处理仅获取主显示器。多显示器支持需要更复杂的逻辑。 const { width, height } screen.getPrimaryDisplay().bounds; overlayWindow new BrowserWindow({ width, height, x: 0, y: 0, frame: false, transparent: true, alwaysOnTop: true, skipTaskbar: true, focusable: false, // 避免获取焦点 webPreferences: { preload: path.join(__dirname, preload.js), contextIsolation: true, } }); overlayWindow.loadFile(overlay.html); overlayWindow.setIgnoreMouseEvents(false); // 我们需要捕获这个窗口内的所有鼠标事件 // 窗口显示后开始全局鼠标监听实际监听由原生模块在后台进行 overlayWindow.once(ready-to-show, () { setupGlobalMouseListener(); }); } function setupGlobalMouseListener() { // 使用 global-mouse-events const stopMonitoring startMonitoring((event) { if (!overlayWindow || overlayWindow.isDestroyed()) return; // 将原生事件通过IPC发送到遮罩窗口的渲染进程 overlayWindow.webContents.send(global-mouse-event, event); }); // 当遮罩窗口关闭时停止监听 overlayWindow.on(closed, () { stopMonitoring(); }); } app.whenReady().then(() { // 注册全局快捷键 const ret globalShortcut.register(CommandOrControlShiftA, () { if (overlayWindow overlayWindow.isVisible()) { overlayWindow.hide(); } else { createOverlayWindow(); } }); if (!ret) { console.error(全局快捷键注册失败); } }); // 监听来自渲染进程的“截图完成”消息 ipcMain.on(capture-area, (event, rect) { // rect: { x, y, width, height } console.log(捕获区域:, rect); // 1. 隐藏遮罩窗口 if (overlayWindow) overlayWindow.hide(); // 2. 使用 robotjs 或 electron 的 desktopCapturer 来截取指定区域的屏幕 // 这里以 robotjs 截屏为例 const { captureScreen } require(robotjs); const img captureScreen(rect.x, rect.y, rect.width, rect.height); // img 是一个包含像素数据的对象可以保存为图片文件 // 3. 将图片数据传回主窗口或进行其他处理 mainWindow.webContents.send(screenshot-captured, img); });遮罩窗口渲染进程 (overlay.html / renderer.js) 部分!DOCTYPE html html body stylemargin:0; overflow:hidden; background:transparent; canvas idselectionCanvas styleposition:absolute; top:0; left:0;/canvas script srcrenderer.js/script /body /html// renderer.js const canvas document.getElementById(selectionCanvas); const ctx canvas.getContext(2d); let isDrawing false; let startPos { x: 0, y: 0 }; let currentPos { x: 0, y: 0 }; // 初始化Canvas为全屏 function resizeCanvas() { canvas.width window.innerWidth; canvas.height window.innerHeight; } window.addEventListener(resize, resizeCanvas); resizeCanvas(); // 通过 preload.js 暴露的 API 接收主进程转发来的全局鼠标事件 window.electronAPI.onGlobalMouseEvent((event) { switch (event.name) { case mousedown: if (event.button 0) { // 左键按下 isDrawing true; startPos { x: event.x, y: event.y }; currentPos { ...startPos }; drawSelection(); } break; case mousemove: if (isDrawing) { currentPos { x: event.x, y: event.y }; drawSelection(); } break; case mouseup: if (isDrawing event.button 0) { isDrawing false; const rect { x: Math.min(startPos.x, currentPos.x), y: Math.min(startPos.y, currentPos.y), width: Math.abs(currentPos.x - startPos.x), height: Math.abs(currentPos.y - startPos.y) }; // 通知主进程截图 window.electronAPI.captureArea(rect); // 清空画布 ctx.clearRect(0, 0, canvas.width, canvas.height); } break; } }); function drawSelection() { // 清空上一帧 ctx.clearRect(0, 0, canvas.width, canvas.height); // 绘制半透明遮罩 ctx.fillStyle rgba(0, 0, 0, 0.3); ctx.fillRect(0, 0, canvas.width, canvas.height); // 绘制选择框 const x Math.min(startPos.x, currentPos.x); const y Math.min(startPos.y, currentPos.y); const w Math.abs(currentPos.x - startPos.x); const h Math.abs(currentPos.y - startPos.y); // 框内清除遮罩 ctx.clearRect(x, y, w, h); // 绘制边框 ctx.strokeStyle #3498db; ctx.lineWidth 2; ctx.strokeRect(x, y, w, h); // 可选绘制尺寸提示 ctx.fillStyle #3498db; ctx.font 14px Arial; ctx.fillText(${w} x ${h}, x 5, y 20); }5.3 避坑指南与优化建议性能全局鼠标移动事件频率极高。在渲染进程的mousemove事件处理中drawSelection函数会被疯狂调用。确保你的绘制代码足够高效。可以使用requestAnimationFrame来节流绘制。多显示器上面的例子只处理了主显示器。真实场景中你需要用screen.getAllDisplays()获取所有显示器信息并创建一个覆盖所有显示器的巨大窗口或者为每个显示器创建一个窗口。鼠标事件的坐标也是基于整个虚拟屏幕的需要做坐标转换。坐标转换从原生模块获取的(x, y)坐标是相对于整个虚拟屏幕的。而你的 Canvas 是相对于窗口客户区的。如果窗口不是从 (0,0) 开始或者存在多显示器你需要进行坐标转换。screen模块的getDisplayNearestPoint({x, y})可以帮助你找到鼠标所在的显示器。用户体验在开始拖拽时可以给鼠标换一个样式如十字准星。这可以通过在 Canvas 上设置cursor样式实现。截图完成后最好有一个视觉反馈如闪屏效果。错误处理全局监听可能因权限问题失效。要有降级方案比如提示用户去系统设置中开启权限或者回退到仅窗口内截图模式。这个实战项目涵盖了从全局快捷键、透明窗口、跨进程通信到原生模块集成的完整链条。虽然代码量看起来不少但每一步都有明确的目的。当你成功运行起来看到可以通过鼠标拖拽任意截取屏幕区域时你会对 Electron 的桌面应用能力有更深的理解。这不仅仅是监听鼠标更是将浏览器前端技术与操作系统底层能力无缝融合的体现。

相关新闻

AIGlasses_for_navigation在机器人SLAM中的应用效果对比

AIGlasses_for_navigation在机器人SLAM中的应用效果对比

AIGlasses_for_navigation在机器人SLAM中的应用效果对比 最近在机器人领域,一个叫AIGlasses_for_navigation的工具引起了我的注意。它和我们过去常用的那些传统视觉SLAM算法不太一样,不是靠人工设计的规则去理解环境,而是用深度学习那一套&a…

2026/7/3 19:06:11 阅读更多 →
Simulink中利用Transfer Fcn实现突变信号的一阶迟滞平滑优化

Simulink中利用Transfer Fcn实现突变信号的一阶迟滞平滑优化

1. 为什么你的Simulink模型信号总是“跳来跳去”? 做仿真建模的朋友,估计都遇到过这个头疼的问题:模型里某个信号,比如一个开关指令、一个设定值切换,或者一个外部干扰,突然从一个值“蹦”到另一个值。这种…

2026/7/2 20:03:28 阅读更多 →
心声,是你抛开所有身份、期待、压力后,最安静的那声低语; 自我,是你不依附任何人、不被任何标准定义的内核

心声,是你抛开所有身份、期待、压力后,最安静的那声低语; 自我,是你不依附任何人、不被任何标准定义的内核

心声是灵魂的低语,自我是人生的底气 目录 心声是灵魂的低语,自我是人生的底气 一、什么是心声? 二、什么是自我? 三、心声与自我:一生最重要的修行 写在最后 我在世界在,我不在世界将不复存在 我们这一生,都在忙着回应世界。 回应别人的期待,回应世俗的标准,回应外界…

2026/5/17 6:54:10 阅读更多 →

最新新闻

用AI变声神器RVC实现10分钟语音转换:从零开始的完整实战指南

用AI变声神器RVC实现10分钟语音转换:从零开始的完整实战指南

用AI变声神器RVC实现10分钟语音转换&#xff1a;从零开始的完整实战指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-C…

2026/7/4 8:31:20 阅读更多 →
从“是什么“到“为什么“:现代系统诊断工具witr如何重新定义进程分析范式

从“是什么“到“为什么“:现代系统诊断工具witr如何重新定义进程分析范式

从"是什么"到"为什么"&#xff1a;现代系统诊断工具witr如何重新定义进程分析范式 【免费下载链接】witr Why is this running? 项目地址: https://gitcode.com/GitHub_Trending/wi/witr 在当今复杂的系统环境中&#xff0c;当进程异常消耗资源、端…

2026/7/4 8:29:19 阅读更多 →
如何用Flask-profiler定位最耗时的API端点?实战案例分享

如何用Flask-profiler定位最耗时的API端点?实战案例分享

如何用Flask-profiler定位最耗时的API端点&#xff1f;实战案例分享 【免费下载链接】flask-profiler a flask profiler which watches endpoint calls and tries to make some analysis. 项目地址: https://gitcode.com/gh_mirrors/fl/flask-profiler Flask-profiler是…

2026/7/4 8:29:19 阅读更多 →
FlipperZeroHondaFirmware工作原理深度解析:433MHz RF信号捕获技术

FlipperZeroHondaFirmware工作原理深度解析:433MHz RF信号捕获技术

FlipperZeroHondaFirmware工作原理深度解析&#xff1a;433MHz RF信号捕获技术 【免费下载链接】FlipperZeroHondaFirmware Custom Firmware for the Flipper Zero, to add support for Honda key fobs (FCC ID: KR5V2X) 项目地址: https://gitcode.com/gh_mirrors/fl/Flippe…

2026/7/4 8:23:17 阅读更多 →
大模型‘养虾测试’:评估世界模型与长程一致性新标尺

大模型‘养虾测试’:评估世界模型与长程一致性新标尺

1. 项目概述&#xff1a;当“养虾”成为大模型能力测试的新标尺最近在好几个技术群和行业论坛里&#xff0c;频繁看到有人甩出一句&#xff1a;“来&#xff0c;养只虾试试&#xff1f;”——不是水产养殖交流&#xff0c;也不是美食探店邀约&#xff0c;而是工程师、产品经理、…

2026/7/4 8:19:17 阅读更多 →
智能解析技术赋能教育数字化转型:tchMaterial-parser的技术架构与应用实践

智能解析技术赋能教育数字化转型:tchMaterial-parser的技术架构与应用实践

智能解析技术赋能教育数字化转型&#xff1a;tchMaterial-parser的技术架构与应用实践 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课…

2026/7/4 8:15:16 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布&#xff0c;这是一个关键的安全修复版本&#xff0c;修复了多个方面的问题&#xff0c;还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出&#xff0c;mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南&#xff1a;使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL&#xff08;Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器&#xff0c;与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻