LoadLibrary 取得 DLL 模組控制代碼GetProcAddress 取得鉤子程序位址SetWindowsHookEx 傳入模組控制代碼、執行緒 ID=0 (關聯所有執行緒)
public void Start(bool installMouseHook, bool installKeyboardHook)
{
// 滑鼠鉤子 (WH_MOUSE_LL = 14)
if (hMouseHook == IntPtr.Zero && installMouseHook)
{
MouseHookProcedure = new HookProc(MouseHookProc);
hMouseHook = SetWindowsHookEx(
WH_MOUSE_LL,
MouseHookProcedure,
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
0);
if (hMouseHook == IntPtr.Zero)
{
int errorCode = Marshal.GetLastWin32Error();
Stop(true, false, false);
throw new Win32Exception(errorCode);
}
}
// 鍵盤鉤子 (WH_KEYBOARD_LL = 13)
if (hKeyboardHook == IntPtr.Zero && installKeyboardHook)
{
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
hKeyboardHook = SetWindowsHookEx(
WH_KEYBOARD_LL,
KeyboardHookProcedure,
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
0);
if (hKeyboardHook == IntPtr.Zero)
{
int errorCode = Marshal.GetLastWin32Error();
Stop(false, true, false);
throw new Win32Exception(errorCode);
}
}
}
MouseHookProcedure、KeyboardHookProcedure 必須為成員變數,防止 GC 回收Stop 清理已安裝鉤子