Files
QuickLook/QuickLook/GlobalKeyboardHook.cs
Paddy Xu f11c59be01 ..
2017-04-30 02:27:07 +03:00

77 lines
2.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using QuickLook.NativeMethods;
namespace QuickLook
{
internal class GlobalKeyboardHook : IDisposable
{
private static GlobalKeyboardHook _instance;
private User32.KeyboardHookProc _callback;
private IntPtr _hhook = IntPtr.Zero;
internal List<Keys> HookedKeys = new List<Keys>();
protected GlobalKeyboardHook()
{
Hook();
}
public void Dispose()
{
GC.SuppressFinalize(this);
Unhook();
}
internal event KeyEventHandler KeyDown;
internal event KeyEventHandler KeyUp;
~GlobalKeyboardHook()
{
Dispose();
}
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)
{
var key = (Keys) lParam.vkCode;
if (HookedKeys.Contains(key))
{
var kea = new KeyEventArgs(key);
if (wParam == User32.WM_KEYDOWN || wParam == User32.WM_SYSKEYDOWN)
KeyDown?.Invoke(this, kea);
if (wParam == User32.WM_KEYUP || wParam == User32.WM_SYSKEYUP)
KeyUp?.Invoke(this, kea);
if (kea.Handled)
return 1;
}
}
return User32.CallNextHookEx(_hhook, code, wParam, ref lParam);
}
}
}