/// <summary> /// Raises the HookInvoked event. This method can be overriden /// for particular implementations of a hook, or an implementation /// can respond to the HookInvoked event. /// </summary> /// <param name="e">The HookEventArgs for this hook /// event.</param> protected virtual void OnHookInvoked(ref HookEventArgs e) { if (HookInvoked != null) { HookInvoked(this, ref e); } }
/// <summary> /// Override for the generic hook's invoked event to /// convert to a strongly typed MouseHookEvent: /// </summary> /// <param name="e">Generic Hook event argument details</param> protected override void OnHookInvoked(ref HookEventArgs e) { // Convert into mouse details: MOUSEHOOKSTRUCT mhs = (MOUSEHOOKSTRUCT)Marshal.PtrToStructure( e.lParam, typeof(MOUSEHOOKSTRUCT)); MouseHookEventArgs mhe = new MouseHookEventArgs( e.wParam, mhs); OnMouseHookEvent(ref mhe); }
/// <summary> /// Default filter function. /// </summary> /// <param name="code">Hook code</param> /// <param name="wParam">Hook wParam</param> /// <param name="lParam">Hook lParam</param> /// <returns></returns> private int CoreHookProc(int code, IntPtr wParam, IntPtr lParam) { // According to MSDN docs, if code < 0 then you must call // the next hook in the chain: if (code < 0) { return(CallNextHookEx(HookHandle, code, wParam, lParam)); } else { // Call the event: HookEventArgs e = new HookEventArgs(); e.HookCode = code; e.wParam = wParam; e.lParam = lParam; OnHookInvoked(ref e); // Yield to the next hook in the chain: return(CallNextHookEx(HookHandle, e.HookCode, e.wParam, e.lParam)); } }