QuickLook插件开发教程:从零编写你的第一个文件预览插件
【免费下载链接】QuickLookBring macOS “Quick Look” feature to Windows项目地址: https://gitcode.com/gh_mirrors/qu/QuickLook
QuickLook 是一款把 macOS 的"快速查看"体验带到 Windows 的文件预览工具,通过按键即可在独立窗口中瞬间预览图片、视频、文档、压缩包等各类文件,无需打开任何完整应用程序。本文将带你从零开始编写第一个 QuickLook 插件,让 QuickLook 支持一种全新的文件类型预览。
1. 理解插件架构
QuickLook 采用插件化设计:每个文件类型的预览功能都是独立插件,主程序负责调度,插件负责渲染。所有插件都实现统一的IViewer接口,这是整个插件开发的核心契约。
📄 接口定义:QuickLook.Common/Plugin/IViewer.cs
IViewer包含6 个成员,构成插件的生命周期:
| 成员 | 作用 | 调用时机 |
|---|---|---|
Priority | 插件优先级(数字越大越优先) | 加载时 |
Init() | 一次性初始化(解压资源等) | 应用启动时 |
CanHandle(path) | 判断能否处理该文件 | 每次按键时 |
Prepare(path, context) | 窗口显示前的轻量准备 | 预览前 |
View(path, context) | 执行实际加载与渲染 | 预览时 |
Cleanup() | 释放非托管资源 | 预览结束时 |
💡
ContextObject是插件与主程序交互的运行时对象,可设置标题、尺寸、主题、忙状态等。详见 QuickLook.Common/Plugin/ContextObject.cs
2. 创建插件项目
新建一个 WPF 类库项目(参考现有插件结构),并添加对QuickLook.Common的引用:
<ProjectReference Include="..\QuickLook.Common\QuickLook.Common.csproj" />完整示例可参考:QuickLook.Plugin/QuickLook.Plugin.BinaryViewer/
📌 若独立开发,可直接通过 NuGet 引用
QuickLook.Common包,见 QuickLook.Common/README.md
3. 编写 Plugin.cs 核心逻辑
插件入口类命名为Plugin,实现IViewer接口。以支持自定义扩展名为例:
public sealed class Plugin : IViewer { private static readonly HashSet<string> Extensions = [".myext"]; private MyPanel _panel; public int Priority => 0; public void Init() { } public bool CanHandle(string path) { return !Directory.Exists(path) && Extensions.Any(ext => path.EndsWith(ext, StringComparison.OrdinalIgnoreCase)); } public void Prepare(string path, ContextObject context) { context.PreferredSize = new Size(900, 600); context.Title = Path.GetFileName(path); } public void View(string path, ContextObject context) { _panel = new MyPanel(); _panel.LoadFile(path); context.ViewerContent = _panel; context.IsBusy = false; // 关闭加载指示器 } public void Cleanup() { _panel?.Unload(); _panel = null; } }关键要点:
CanHandle必须排除目录,并用不区分大小写的方式匹配扩展名Prepare只做轻量工作,禁止耗时操作View中创建 WPF 控件,赋值给context.ViewerContent,最后务必context.IsBusy = falseCleanup释放资源,避免内存泄漏
4. 创建预览面板(WPF 控件)
插件的"内容区"是一个普通的 WPFUserControl,负责真正的渲染。以十六进制查看器为参考:
📄 面板示例:QuickLook.Plugin/QuickLook.Plugin.BinaryViewer/BinaryViewerPanel.xaml
面板需暴露一个加载方法(如LoadFile(string path))供View()调用。
5. 可选:添加"更多菜单"功能
若希望在预览窗口标题栏的右键菜单中添加自定义操作(如"另存为"、"打开方式"),可额外实现IMoreMenuExtended接口:
📄 接口定义:QuickLook.Common/Plugin/MoreMenu/IMoreMenu.cs
📄 使用示例:QuickLook.Plugin/QuickLook.Plugin.BinaryViewer/Plugin.MoreMenu.cs
6. 构建与部署
- 编译插件项目(Release | x64),输出 DLL
- 将 DLL 复制到 QuickLook 安装目录的
QuickLook.Plugin文件夹 - 重启 QuickLook,选中目标文件按Space即可预览
7. 进阶技巧
- 优先级调整:多个插件处理同一文件时,
Priority值大者胜出,避免冲突 - 文件头检测:
CanHandle中可读取文件前若干字节,按 Magic Number 判断真实类型 - 主题适配:通过
context.Theme切换深浅色主题,Theme = Themes.Dark启用深色 - 尺寸适配:调用
context.SetPreferredSizeFit(size, maxRatio)让窗口随屏幕缩放
参考项目结构
| 路径 | 说明 |
|---|---|
| QuickLook.Common/Plugin/ | 插件接口与运行时对象 |
| QuickLook.Common/Helpers/ | 工具类(文件、窗口、主题) |
| QuickLook.Plugin/ | 20+ 官方插件,覆盖图片/文本/PDF/数据库等 |
| QuickLook.Plugin/QuickLook.Plugin.PluginInstaller/ | 插件安装器,可参考其加载逻辑 |
掌握以上 6 步,你就能为 QuickLook 编写任意文件类型的预览插件,让"按空格即预览"的体验扩展到你需要的每一种文件格式。
【免费下载链接】QuickLookBring macOS “Quick Look” feature to Windows项目地址: https://gitcode.com/gh_mirrors/qu/QuickLook
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考