Github每日精选(第40期):为 Windows 带来 macOS “快速查看”功能QuickLook

QuickLook

QucikLookmacOS 中的Quick Look 快速查看功能,它允许用户通过按键Space以闪电般的速度查看文件内容。

这个功能是非常有用的,特别是对于查找文件的时候,我们可能不清楚里面的内容,通过这个软件,我们只要轻轻的按一下,空格键,我们马上就能够预览里面的内容了。然而到现在为止,Windows 没有这个方便的功能…

作者知道在 Internet 上已经有几种替代方法可用(例如WinQuickLookSeer)。尽管有这些选择,作者仍然决定自己制作另一个,因为它们要么没有被积极开发,缺乏多样性,要么要求一些其他的资源。

github的地址在这里

在这里插入图片描述

能带来什么

我们先来看看QuickLook 能 给我们带来什么,看我们在查看文件的时候,我们想看看这个word里面写了什么,我们可以这样操作。

选择我们要查看的word文件,按下空格键。

在这里插入图片描述

再来,我们先看看zip文件中,存在哪些文件,这是一个实用的操作,选到该压缩文件,轻轻按下空格键。压缩文件中的内容,清楚的展现在我们的眼前。

在这里插入图片描述

确实非常的直观好用。

下载/安装

到这里,下载release版本的,安装就可以了。

热键和按钮
  • Spacebar 显示/隐藏预览窗口
  • Esc隐藏预览窗口
  • Enter打开/执行当前文件
  • Mouse ↑ ↓ ← →预览另一个文件
  • Mouse Wheel放大/缩小(图像)
  • Ctrl+Mouse Wheel放大/缩小 (PDF)
  • Wheel增加/减少音量
相关代码分析

当我们按住 空格键,我们是怎么知道相应的消息的呢?QuickLook 使用了hook的手段。来看看相关的代码。

using System;
using System.Windows.Forms;
using System.Windows.Input;
using QuickLook.Common.NativeMethods;
using KeyEventArgs = System.Windows.Forms.KeyEventArgs;
using KeyEventHandler = System.Windows.Forms.KeyEventHandler;

namespace QuickLook.Helpers
{
    internal class GlobalKeyboardHook : IDisposable
    {
        private static GlobalKeyboardHook _instance;

        private User32.KeyboardHookProc _callback;
        private IntPtr _hhook = IntPtr.Zero;

        protected GlobalKeyboardHook()
        {
            Hook();
        }

        public void Dispose()
        {
            GC.SuppressFinalize(this);

            Unhook();
        }

        internal event KeyEventHandler KeyDown;
        internal event KeyEventHandler KeyUp;

        internal static GlobalKeyboardHook GetInstance()
        {
            return _instance ?? (_instance = new GlobalKeyboardHook());
        }

        private void Hook()
        {
            _callback = HookProc;

            var hInstance = Kernel32.LoadLibrary("user32.dll");
            _hhook = User32.SetWindowsHookEx(User32.WH_KEYBOARD_LL, _callback, hInstance, 0);
        }

        private void Unhook()
        {
            if (_callback == null) return;

            User32.UnhookWindowsHookEx(_hhook);

            _callback = null;
        }

        private int HookProc(int code, int wParam, ref User32.KeyboardHookStruct lParam)
        {
            if (code < 0)
                return User32.CallNextHookEx(_hhook, code, wParam, ref lParam);

            if (IsWindowsKeyPressed())
                return User32.CallNextHookEx(_hhook, code, wParam, ref lParam);

            var key = (Keys) lParam.vkCode;
            key = AddModifiers(key);

            var kea = new KeyEventArgs(key);

            if (wParam == User32.WM_KEYDOWN || wParam == User32.WM_SYSKEYDOWN)
                KeyDown?.Invoke(this, kea);
            else if (wParam == User32.WM_KEYUP || wParam == User32.WM_SYSKEYUP)
                KeyUp?.Invoke(this, kea);

            return kea.Handled ? 1 : User32.CallNextHookEx(_hhook, code, wParam, ref lParam);
        }

        private bool IsWindowsKeyPressed()
        {
            return Keyboard.IsKeyDown(Key.LWin) || Keyboard.IsKeyDown(Key.RWin);
        }

        private Keys AddModifiers(Keys key)
        {
            //Ctrl
            if ((Keyboard.Modifiers & ModifierKeys.Control) != 0) key = key | Keys.Control;

            //Shift
            if ((Keyboard.Modifiers & ModifierKeys.Shift) != 0) key = key | Keys.Shift;

            //Alt
            if ((Keyboard.Modifiers & ModifierKeys.Alt) != 0) key = key | Keys.Alt;

            return key;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go2coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值