// ctor runs from within a lock, and should be as quick as is possible public HookLifetimeManager(HookCallback callback) { Contract.Requires(callback != null); this.pGetMessageHook_Callback = GetMessageHook_Callback; this.pSendMessageHook_Callback = SendMessageHook_Callback; this.Callback = callback; this.GetMessageHook = SetWindowsHookEx(WH_GETMESSAGE, pGetMessageHook_Callback, IntPtr.Zero, GetCurrentThreadId()); if (this.GetMessageHook.IsInvalid) { throw new Win32Exception(); } try { this.SendMessageHook = SetWindowsHookEx(WH_CALLWNDPROCRET, pSendMessageHook_Callback, IntPtr.Zero, GetCurrentThreadId()); if (this.SendMessageHook.IsInvalid) { throw new Win32Exception(); } } catch { GetMessageHook.Dispose(); throw; } }
public static extern HookSafeHandle SetWindowsHookEx(int idHook, GetOrSendWndProc wndProc, IntPtr hMod, int dwThreadId);