C# 全局键盘钩子

/// <summary>
/// 全局键盘钩子。这可以用来在全球范围内捕捉键盘输入。
/// </summary>
public static class KeyboardHook
{
// 钩子的句柄(用于安装/卸载).
private static IntPtr hHook = IntPtr.Zero;

//委托该点的过滤功能
private static Hooks.HookProc hookproc = new Hooks.HookProc(Filter);

/// <summary>
/// 请检查如果任一控制修饰符是积极的。
/// </summary>
public static bool Control = false;
/// <summary>
/// 检查,看看是否要么移位修饰符是积极的。
/// </summary>
public static bool Shift = false;
/// <summary>
/// 检查看看或者ALT修饰符是积极的。
/// </summary>
public static bool Alt = false;
/// <summary>
///检查,看看是否要么运修饰符是积极的。
/// </summary>
public static bool Win = false;

/// <summary>
/// 按键的函数原型。
/// </summary>
public delegate bool KeyPressed();

/// <summary>
/// 键处理和他们的回调
/// </summary>
private static System.Collections.Generic.Dictionary<Keys, KeyPressed> handledKeysDown = new System.Collections.Generic.Dictionary<Keys, KeyPressed>();
private static System.Collections.Generic.Dictionary<Keys, KeyPressed> handledKeysUp = new System.Collections.Generic.Dictionary<Keys, KeyPressed>();

/// <summary>
/// 委托处理KeyDown事件。
/// </summary>
/// <param name="key">被按下的键。检查控制,按住Shift,Alt键,修饰符和赢。</param>
/// <returns>如此,如果你要的关键,通过(被确认为应用程序),假的,如果你想ITTO被困(应用程序从来没有看到它)。</returns>
public delegate bool KeyboardHookHandler(Keys key);

/// <summary>
/// 在此添加一个钩子处理程序委托,以激活热键。
/// </summary>
public static KeyboardHookHandler KeyDown;

/// <summary>
///在挂机状态下保持跟踪。
/// </summary>
private static bool Enabled;

/// <summary>
/// 启动键盘钩子。
/// </summary>
/// <returns>True如果没有例外。</returns>
public static bool Enable()
{
if (Enabled == false)
{
try
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
hHook = Hooks.SetWindowsHookEx((int)Hooks.HookType.WH_KEYBOARD_LL, hookproc, Hooks.GetModuleHandle(curModule.ModuleName), 0);
Enabled = true;
return true;
}
catch
{
Enabled = false;
return false;
}
}
else
return false;
}

/// <summary>
/// 禁用键盘挂钩。
/// </summary>
/// <returns>True如果禁用正确。</returns>
public static bool Disable()
{
if (Enabled == true)
{
try
{
Hooks.UnhookWindowsHookEx(hHook);
Enabled = false;
return true;
}
catch
{
Enabled = true;
return false;
}
}
else
return false;
}

private static IntPtr Filter(int nCode, IntPtr wParam, IntPtr lParam)
{
bool result = true;

if (nCode >= 0)
{
if (wParam == (IntPtr)Hooks.WM_KEYDOWN
|| wParam == (IntPtr)Hooks.WM_SYSKEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
if ((Keys)vkCode == Keys.LControlKey ||
(Keys)vkCode == Keys.RControlKey)
Control = true;
else if ((Keys)vkCode == Keys.LShiftKey ||
(Keys)vkCode == Keys.RShiftKey)
Shift = true;
else if ((Keys)vkCode == Keys.RMenu ||
(Keys)vkCode == Keys.LMenu)
Alt = true;
else if ((Keys)vkCode == Keys.RWin ||
(Keys)vkCode == Keys.LWin)
Win = true;
else
result = OnKeyDown((Keys)vkCode);
}
else if (wParam == (IntPtr)Hooks.WM_KEYUP
|| wParam == (IntPtr)Hooks.WM_SYSKEYUP)
{
int vkCode = Marshal.ReadInt32(lParam);
if ((Keys)vkCode == Keys.LControlKey ||
(Keys)vkCode == Keys.RControlKey)
Control = false;
else if ((Keys)vkCode == Keys.LShiftKey ||
(Keys)vkCode == Keys.RShiftKey)
Shift = false;
else if ((Keys)vkCode == Keys.RMenu ||
(Keys)vkCode == Keys.LMenu)
Alt = false;
else if ((Keys)vkCode == Keys.RWin ||
(Keys)vkCode == Keys.LWin)
Win = false;
else
result = OnKeyUp((Keys)vkCode);
}
}

return result ? Hooks.CallNextHookEx(hHook, nCode, wParam, lParam) : new IntPtr(1);
}

/// <summary>
/// 增加了一个关键的钩。
/// </summary>
/// <param name="key">要添加的关键。</param>
/// <param name="callback">被称为该功能时,按下此键。</param>
public static bool AddKeyDown(Keys key, KeyPressed callback)
{
KeyDown = null;
if (!handledKeysDown.ContainsKey(key))
{
handledKeysDown.Add(key, callback);
return true;
}
else
return false;
}

/// <summary>
/// 增加了一个关键的钩。
/// </summary>
/// <param name="key">要添加的关键。</param>
/// <param name="callback">被称为该功能时,按下此键。</param>
public static bool AddKeyUp(Keys key, KeyPressed callback)
{
if (!handledKeysUp.ContainsKey(key))
{
handledKeysUp.Add(key, callback);
return true;
}
else
return false;
}

/// <summary>
///新增的KeyDown包装
/// </summary>
/// <param name="key">要添加的关键。</param>
/// <param name="callback">被称为该功能时,按下此键。</param>
public static bool Add(Keys key, KeyPressed callback)
{
return AddKeyDown(key, callback);
}

/// <summary>
/// 从钩取出一个关键。
/// </summary>
/// <param name="key">被删除的关键。</param>
public static bool RemoveDown(Keys key)
{
return handledKeysDown.Remove(key);
}

/// <summary>
/// 将重点从钩起来。
/// </summary>
/// <param name="key">被删除的关键。</param>
public static bool RemoveUp(Keys key)
{
return handledKeysUp.Remove(key);
}

/// <summary>
/// 删除一个挂机键。
/// </summary>
/// <param name="key">被删除的关键。</param>
public static bool Remove(Keys key)
{
return RemoveDown(key);
}

private static bool OnKeyDown(Keys key)
{
if (KeyDown != null)
return KeyDown(key);
if (handledKeysDown.ContainsKey(key))
return handledKeysDown[key]();
else
return true;
}

private static bool OnKeyUp(Keys key)
{
if (handledKeysUp.ContainsKey(key))
return handledKeysUp[key]();
else
return true;
}

/// <summary>
/// 返回一个给定的键根据当前修饰符的字符串表示形式。
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static string KeyToString(Keys key)
{
return (KeyboardHook.Control ? "Ctrl + " : "") +
(KeyboardHook.Alt ? "Alt + " : "") +
(KeyboardHook.Shift ? "Shift + " : "") +
(KeyboardHook.Win ? "Win + " : "") +
key.ToString();
}
}

posted @ 2021-10-20 17:58  龙丶谈笑风声  阅读(842)  评论(2编辑  收藏  举报