QucikLook
像macOS
中的Quick Look
快速查看功能,它允许用户通过按键Space
以闪电般的速度查看文件内容。
这个功能是非常有用的,特别是对于查找文件的时候,我们可能不清楚里面的内容,通过这个软件,我们只要轻轻的按一下,空格键,我们马上就能够预览里面的内容了。然而到现在为止,Windows 没有这个方便的功能…
作者知道在 Internet
上已经有几种替代方法可用(例如WinQuickLook
和Seer
)。尽管有这些选择,作者仍然决定自己制作另一个,因为它们要么没有被积极开发,缺乏多样性,要么要求一些其他的资源。
github的地址在这里。
我们先来看看QuickLook
能 给我们带来什么,看我们在查看文件的时候,我们想看看这个word
里面写了什么,我们可以这样操作。
选择我们要查看的word
文件,按下空格键。
再来,我们先看看zip
文件中,存在哪些文件,这是一个实用的操作,选到该压缩文件,轻轻按下空格键。压缩文件中的内容,清楚的展现在我们的眼前。
确实非常的直观好用。
到这里,下载release版本的,安装就可以了。
Spacebar
显示/隐藏预览窗口Esc
隐藏预览窗口Enter
打开/执行当前文件Mouse ↑ ↓ ← →
预览另一个文件Mouse Wheel
放大/缩小(图像)Ctrl+Mouse Wheel
放大/缩小 (PD
F)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;
}
}
}