lynx
Published on 2025-04-22 / 7 Visits
0
0

让 Windows 也拥有“空格键预览”

以下为AI自动生成文章。

预览小工具仿造Mac上的空格预览功能

  • 点击空格(后采用了右键菜单->快速预览)打开图片

  • 按上下键可预览前后图片

  • 点击空格或Esc退出预览

开发工具:

  • 网页千问模型:讨论需求和设计思路

  • TRAE(豆包1.5):直接生成代码

  • Visual Studio 2022:执行并发布exe

开发时间:从开始讨论需求到发布exe,2.5小时。


在 macOS 上,按下空格键就能快速预览图片或视频文件,简直不要太方便!但 Windows 用户就只能眼巴巴地看着吗?当然不是!为了弥补这个遗憾,我决定自己动手开发一个轻量化的预览工具。最终选择了通过右键菜单启动预览程序的方式,并结合窗口内的键盘事件监听实现关闭功能。整个过程充满了挑战和乐趣,下面我就来分享一下我的开发经历。

1. 功能设计:简单高效才是王道

(1) 预览功能

用户在文件资源管理器中选中一张图片或视频文件后,可以通过右键菜单中的“预览”选项启动自定义预览程序。程序会自动加载并显示选中的文件内容,就像给文件开了个“快速通道”。

(2) 关闭功能

在预览窗口中,用户按下 Esc 键或 空格键 就能轻松关闭窗口。这里用的是 WPF 的 KeyDown 事件监听,而不是全局键盘监听,既简单又高效,完全够用了!

2. 开发环境与工具:工欲善其事,必先利其器

- 开发环境

主角当然是 Visual Studio 2022 啦!搭配 .NET SDK 和 WPF 组件,妥妥的开发神器。

- 技术栈

使用 C# 和 WPF 开发预览程序,代码简洁易懂,功能却一点都不含糊。

- 打包工具

通过 Visual Studio 的发布向导生成独立的可执行文件.exe),分分钟搞定分发问题。

3. 核心功能实现:从无到有,一步步搞定!

(1) 右键菜单扩展:让预览触手可及

为了让我们的程序出现在右键菜单中,需要对 Windows 注册表进行修改。具体来说,找到目标路径(如 HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\Preview\command),并将命令设置为预览程序的路径,附带 %1 参数表示选中的文件路径。

# 找到注册表
HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\Preview\command

# 设置命令
"D:\Preview\Previewer.exe" "%1"

完成后,用户只需右键点击图片文件,就能看到“预览”选项,点击一下,预览窗口瞬间弹出,简直不要太方便!

(2) 图片预览功能:让窗口跟着图片走

使用 WPF 的 Image 控件动态加载图片,支持多种格式(如 .jpg, .png 等)。窗口大小还会根据图片尺寸自动调整,完美适配每一张图片。程序通过解析命令行参数获取文件路径,并加载对应的图片文件。

(3) 关闭功能:轻轻一按,窗口说拜拜

通过 WPF 的 KeyDown 事件监听 Esc 键和 空格键,按下任意一个键就能关闭预览窗口。绑定事件后,用户只需轻轻一按,窗口立马消失,干净利落!

4. 备选方案:如果想要更酷炫的操作怎么办?

虽然最终选择了右键菜单方式启动预览程序,但如果想要实现更酷炫的功能,比如按下空格键直接启动预览,也不是不可能!以下是备选方案的实现思路:

(1) 全局键盘监听:空格键也能玩出花

通过设置低级键盘钩子捕获系统范围内的空格键按下事件。当检测到空格键时,获取当前文件资源管理器中选中的文件路径,并启动预览程序。

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {
        int vkCode = Marshal.ReadInt32(lParam);
        if ((Keys)vkCode == Keys.Space)
        {
            Console.WriteLine("Space key pressed!");
            StartPreviewer();
        }
    }
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

(2) 获取选中文件路径:谁是焦点文件?

利用 Shell API 或 UI Automation 获取文件资源管理器中当前选中的文件路径。这个步骤确保我们能够准确获取用户选中的文件。

private static string GetSelectedFilePath()
{
    var shellWindows = new Shell32.Shell();
    foreach (Shell32.Folder folder in shellWindows.Windows())
    {
        if (folder.Application.Name == "File Explorer")
        {
            var explorer = (Shell32.IShellFolderViewDual2)folder.Document;
            var selectedItem = explorer.FocusedItem;
            if (selectedItem != null)
            {
                return selectedItem.Path;
            }
        }
    }
    return null;
}

(3) 启动预览程序:一键直达

将获取到的文件路径传递给预览程序,并启动它。这种方式让用户无需右键点击,直接按下空格键即可启动预览。

5. 总结:从零开始,打造属于自己的预览工具

通过这次开发,我成功实现了一个轻量化的图片预览工具,主要功能包括:

1. 右键菜单启动

通过修改注册表,将预览程序添加到文件资源管理器的右键上下文菜单中,操作简单直观。

2. 图片预览

使用 WPF 的 Image 控件动态加载图片,并设置窗口大小自适应图片尺寸,体验流畅自然。

3. 关闭功能

通过当前应用窗口的 KeyDown 事件监听 Esc 键和 空格键,关闭窗口轻松自如。

4. 备选方案

提供了通过全局键盘监听实现空格键启动预览的备选方案,满足不同需求。

这个项目不仅让我学到了很多新知识,也为后续功能扩展(如支持更多文件类型、跨平台支持等)打下了坚实的基础。希望这篇博文能为有类似需求的开发者提供一些灵感和参考!

如果你对某些细节感兴趣,或者有自己的想法,欢迎留言交流哦!一起让开发变得更有趣吧! 😊


Comment