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();
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM