實現效果
- 本輔助類主要是用來方便實現全局鍵盤鉤子,用來捕捉系統全局的鍵盤輸入。
- 通過鍵盤鉤子,我們可以獲取用戶的各種按鍵信息,以及可以屏蔽指定按鍵的操作。
實現步驟
在代碼引用相關的代碼實現動態調用。
實現代碼
- 輔助類提供的方法接口如下所示:
/// 判斷是否CTRL鍵按下
public static bool Control = false;
/// 判斷Shift鍵是否按下
public static bool Shift = false;
/// 檢查Alt鍵是否按下
public static bool Alt = false;
/// 檢查Windows鍵是否按下
public static bool Win = false;
/// 鍵盤敲擊事件代理定義
public delegate bool KeyPressed();
/// 處理鍵盤按下委託函數
public delegate bool KeyboardHookHandler(Keys key);
/// 添加一個鍵盤鉤子處理給當前的鍵
public static KeyboardHookHandler KeyDown;
/// 啓動鍵盤鉤子處理
public static bool Enable()
/// 禁用鍵盤鉤子處理
public static bool Disable()
/// 添加一個按下鍵的鉤子處理
public static bool AddKeyDown(Keys key, KeyPressed callback)
/// 添加一個鍵彈起的鉤子處理
public static bool AddKeyUp(Keys key, KeyPressed callback)
/// 添加一個按下鍵的鉤子處理
public static bool Add(Keys key, KeyPressed callback)
/// 移除一個按下鍵的鉤子處理
public static bool RemoveDown(Keys key)
/// 移除一個彈起鍵的鉤子處理
public static bool RemoveUp(Keys key)
/// 移除一個鍵的鉤子處理
public static bool Remove(Keys key)
/// 返回一個給定的鍵基於當前的控制鍵的字符串表示形式。
public static string KeyToString(Keys key)
- 輔助類KeyboardHook的使用例子代碼如下所示
private void btnKeyboadHook_Click(object sender, EventArgs e)
{
KeyboardHook.Enable();
KeyboardHook.Add(Keys.S, new KeyboardHook.KeyPressed(TestKeyboadHook));
}
private bool TestKeyboadHook()
{
//僅處理Alt + S 的鉤子事件
if (KeyboardHook.Alt)
{
this.Text = DateTime.Now.ToString();
NativeMethods.BringToFront(this.Handle);
}
return true; //如果要被其他程序捕捉,返回True,否則返回False。
}
private void btnRemoveKeyboadHook_Click(object sender, EventArgs e)
{
KeyboardHook.Remove(Keys.S);
}
附上源碼
/// <summary>
///全局鍵盤鉤子,用來捕捉系統全局的鍵盤輸入。
/// </summary>
public static class KeyboardHook
{
//鉤子句柄,用於安裝或者卸載鉤子之用
private static IntPtr hHook = IntPtr.Zero;
//鉤子過濾器處理
private static Hooks.HookProc hookproc = new Hooks.HookProc(Filter);
/// <summary>
/// 判斷是否CTRL鍵按下
/// </summary>
public static bool Control = false;
/// <summary>
/// 判斷Shift鍵是否按下
/// </summary>
public static bool Shift = false;
/// <summary>
/// 檢查Alt鍵是否按下
/// </summary>
public static bool Alt = false;
/// <summary>
/// 檢查Windows鍵是否按下
/// </summary>
public static bool Win = false;
/// <summary>
/// 鍵盤敲擊事件代理定義
/// </summary>
public delegate bool KeyPressed();
/// <summary>
/// 鍵盤處理操作定義
/// </summary>
private static CDictionary<Keys, KeyPressed> handledKeysDown = new CDictionary<Keys, KeyPressed>();
private static CDictionary<Keys, KeyPressed> handledKeysUp = new CDictionary<Keys, KeyPressed>();
/// <summary>
/// 處理鍵盤按下委託函數
/// </summary>
/// <param name="key">
/// 按下的鍵。需檢查CTRL、Shift、Win等鍵。
/// </param>
/// <returns>
/// 如果想應用程序能捕捉到,設置爲True;如果設置爲False,則鍵盤事件被屏蔽。
/// </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>
/// 添加一個按下鍵的鉤子處理
/// </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();
}
}