menyoki扩展开发指南:如何为Wayland与Windows添加平台支持
2026/8/18 16:20:21 网站建设 项目流程

menyoki扩展开发指南:如何为Wayland与Windows添加平台支持

【免费下载链接】menyokiScreen{shot,cast} and perform ImageOps on the command line 🌱 🏞️项目地址: https://gitcode.com/gh_mirrors/me/menyoki

menyoki 是一款基于 Rust 的命令行截图录屏工具,支持录制动画、截取屏幕,并能完成 GIF 制作、图像编辑与分析等操作。目前 menyoki 的截图与录屏功能仅完整支持 Linux X11,Wayland 与 Windows 平台尚无截图录屏能力,这正是 menyoki 扩展开发的主要方向。本文将手把手讲解 menyoki 的窗口系统抽象机制,带你掌握为 Wayland 与 Windows 添加平台支持的核心方法与步骤。

menyoki 为什么需要平台扩展开发

menyoki 的设计理念是把「窗口系统相关」与「图像处理相关」彻底解耦。编辑、分析、查看、格式转换等功能完全不依赖窗口系统,在任何平台编译都能正常工作;只有record(录屏)和capture(截图)两个动作需要访问窗口系统来获取窗口图像。

因此,平台支持扩展的核心任务只有一个:让 menyoki 能够在目标平台上拿到窗口的像素数据。其余功能无需改动。

认识 menyoki 窗口系统抽象:两个关键接口

所有平台扩展都要围绕src/window/mod.rs中的两个 trait 展开:

  • Access:负责初始化窗口系统,并获取一个待操作窗口
  • Capture:负责从窗口抓取图像、显示倒计时、释放资源
pub trait Access<'a, Window: Capture + Send + Sync + Copy + Debug + 'static> { fn init(settings: &'a AppSettings<'a>) -> Option<Self>; fn get_window(&mut self) -> Option<Window>; } pub trait Capture { fn get_image(&self) -> Option<Image>; fn show_countdown(&self); fn release(&self); }

其中Window类型必须满足Send + Sync + Copy + Debug + 'static,因为录屏时图像抓取会在独立线程中进行。

参考实现:X11 与空白模板

  • X11 完整实现:src/x11/mod.rsAccess)、src/x11/display.rs(显示连接与窗口选择)、src/x11/window.rsCapture
  • 空白实现模板:src/ws/mod.rssrc/ws/window.rs,所有方法均为unimplemented!(),是官方留给新平台的开发脚手架

开发新平台支持时,直接以src/ws/为起点,参考src/x11/的写法填充实现即可。

添加 Wayland 平台支持:完整步骤

Wayland 与 X11 架构差异巨大:客户端无法直接访问其他窗口的像素,必须依赖合成器协议。实现方案建议如下:

  1. 选择抓屏协议:使用wlr-screencopy(兼容 wlroots 系合成器,如 Sway、Hyprland)或ext-screencopy协议,通过 wayland-client 建立连接
  2. 实现 Access trait:在init中连接 Wayland 显示服务器,通过wl_registry绑定zwlr_screencopy_manager_v1ext_screencopy_manager_v1get_window中处理「全屏录制」与「窗口选择」两类场景
  3. 实现 Capture traitget_image中发起抓屏请求,将wl_shm共享内存中的wl_buffer拷贝为Imageshow_countdownrelease可参考 X11 实现
  4. 注册模块:仿照main.rs的条件编译写法,为 Wayland 添加新的cfg分支与模块声明

添加 Windows 平台支持:实现方案

Windows 上可以通过 Win32 API 或现成 Rust crate 完成抓屏:

  1. 选择抓屏方案windows/windows-syscrate 配合BitBlt抓取全屏或指定窗口区域(GDI 方案简单稳定);高性能场景可考虑DXGI Desktop Duplication
  2. 实现 Access traitinit中调用EnumWindows枚举窗口或直接定位根窗口/前台窗口;get_windowrootfocusselect等参数返回对应窗口
  3. 实现 Capture traitget_image中用GetDC+BitBlt将窗口客户区复制到内存 DC,再转换为Image的 RGBA 数据
  4. 完善构建配置:在Cargo.toml[target.'cfg(windows)'.dependencies]段添加所需依赖

注册新平台:条件编译与构建配置

src/main.rs目前通过条件编译选择窗口系统实现:

  • 非 Linux 平台:使用ws空白模板
  • Linux 平台:使用x11实现

添加新平台后,需要同步修改:

  • src/main.rs:新增模块声明与WindowSystem的导入分支
  • Cargo.toml:在对应[target.'cfg(...)'.dependencies]段声明平台专属依赖
  • src/window/mod.rsAccesstrait:确认Window类型约束满足线程安全要求

测试与验证方法

  • 参考src/x11/mod.rssrc/x11/window.rs中的测试模块,使用--features test-ws编译运行窗口系统测试
  • 手动验证:menyoki capture --root截图、menyoki record gif --fps 15 --duration 5录屏、menyoki analyze检查输出
  • 图像处理功能(edit、split、make、view)无需窗口系统,可先在新平台验证这些功能是否正常,再逐步推进截图录屏

结语:从模板到完整支持

为 menyoki 添加 Wayland 或 Windows 平台支持并不复杂,核心就是实现AccessCapture两个接口,并接入条件编译。官方已预留src/ws/模板和test-ws测试特性,降低了扩展门槛。按照本文步骤,你可以逐步完成平台支持开发,让 menyoki 的截图录屏能力覆盖更多桌面环境。

【免费下载链接】menyokiScreen{shot,cast} and perform ImageOps on the command line 🌱 🏞️项目地址: https://gitcode.com/gh_mirrors/me/menyoki

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询