封裝 Windows 全域鉤子(`WH_MOUSE_LL`、`WH_KEYBOARD_LL`),支援監控模式(記錄事件)與封鎖模式(攔截不傳遞)。
public bool InstallHook(string flags)
{
this.flags = flags; // "0"=正常, "1"=監控, "2"=封鎖
IntPtr hInstance = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);
// 注意:hInstance 必須為 0x400000 (4194304) 才能成功安裝全域鉤子
if (m_pMouseHook == IntPtr.Zero)
{
m_MouseHookProcedure = MouseHookProc;
m_pMouseHook = Win32API.SetWindowsHookEx(WH_Codes.WH_MOUSE_LL, m_MouseHookProcedure, hInstance, 0);
if (m_pMouseHook == IntPtr.Zero) { UnInstallHook(); return false; }
}
if (m_pKeyboardHook == IntPtr.Zero)
{
m_KeyboardHookProcedure = KeyboardHookProc;
m_pKeyboardHook = Win32API.SetWindowsHookEx(WH_Codes.WH_KEYBOARD_LL, m_KeyboardHookProcedure, hInstance, 0);
if (m_pKeyboardHook == IntPtr.Zero) { UnInstallHook(); return false; }
}
return true;
}
public bool UnInstallHook()
{
bool ok = true;
if (m_pMouseHook != IntPtr.Zero) ok &= Win32API.UnhookWindowsHookEx(m_pMouseHook);
if (m_pKeyboardHook != IntPtr.Zero) ok &= Win32API.UnhookWindowsHookEx(m_pKeyboardHook);
m_pMouseHook = m_pKeyboardHook = IntPtr.Zero;
return ok;
}
public event MouseEventHandler OnMouseActivity;
public event MouseUpdateEventHandler OnMouseUpdate;
public event KeyEventHandler OnKeyDown;
public event KeyPressEventHandler OnKeyPress;
public event KeyEventHandler OnKeyUp;