全域鉤子
public class HookMessage
{
private IntPtr m_HookEx;
/// <summary>
/// 設定自己進程的鉤子
/// </summary>
/// <param name="p_HookCodes">鉤子類型 </param>
public HookMessage(WindowsHookCodes p_HookCodes)
{
m_HookEx = Win32API.SetWindowsHookEx((int)p_HookCodes, new Win32API.HookProc(SetHookProc), IntPtr.Zero, Win32API.GetCurrentThreadId());
}
/// <summary>
/// 設定進程的鉤子
/// </summary>
/// <param name="p_HookCodes">鉤子類型 </param>
/// <param name="p_ThreadID">全域鉤子 </param>
public HookMessage(WindowsHookCodes p_HookCodes, bool p_Zero)
{
IntPtr _Value =System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]);
m_HookEx = Win32API.SetWindowsHookEx((int)p_HookCodes, new Win32API.HookProc(SetHookProc), _Value, 0);
}
/// <summary>
/// 關閉鉤子
/// </summary>
public void UnHookMessage()
{
if (Win32API.UnhookWindowsHookEx(m_HookEx))
{
m_HookEx = IntPtr.Zero;
}
}
public delegate void GetHookMessage(int p_Code, IntPtr p_wParam, IntPtr p_lParam);
public event GetHookMessage GetHook;
private IntPtr SetHookProc(int p_Code, IntPtr p_wParam, IntPtr p_lParam)
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
if (GetHook != null) GetHook(p_Code, p_wParam, p_lParam);
return IntPtr.Zero;
}
}
使用HOOK技術,同時使用GetCursorPos、kb_event、WM_MOUSEMOVE、WM_MOUSEDOWN、WM_MOUSEUP、WM_MOUSEWHELL、WM_KEYDOWN、WM_KEYUP可以檢查全域滑鼠移動、按下/抬起、中鍵滾動、鍵盤按下/抬起動作。