use 'Hooks' in .NET

Started by nandagopal, Jul 28, 2008, 08:31 PM

Previous topic - Next topic

nandagopal


If what you are looking for is just to intercept and handle generic Windows messages such as WM_NCPAINT or alike, you can override WndProc (). You don't need to use the hook procedure. Here is some code that does this:
public enum WinMsg
{
     WM_KEYDOWN = 256,
     WM_KEYUP = 257,
     WM_PAINT = 15,
     WM_CREATE = 1
     .......
     .......
};

protected override void WndProc(ref System.Windows.Forms.Message m)
{
     ..............
     if (m.Msg == (int) WinMsg.WM_PAINT)
     {
          m.Result = new IntPtr(0); // no further processing is needed.
          .......
          .......
     }
     ..............
     base.WndProc(ref m);
}

But if you need to use a hook procedure, be cautious since they might interfere with normal execution of other applications. In some extreme cases, they might bring the whole system down if not processed correctly. Here is the code snippet that shows you how to do implement and use the hook procedure in .NET:
public class Win32Hook
{
     [DllImport("kernel32")]
     public static extern int GetCurrentThreadId();

     [DllImport( "user32", CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
     public static extern int SetWindowsHookEx( HookType idHook,
                    HOOKPROC lpfn,
                    int hmod,
                    int dwThreadId
                    );

     public enum HookType
     {
          WH_KEYBOARD = 2
     }
     public delegate int HOOKPROC(int nCode, int wParam, int lParam);

     private HOOKPROC hookProc; //private field with class scope

     public void SetHook()
     {
           // set the keyboard hook
          hookProc = new HOOKPROC(this.MyKeyboardProc);

          SetWindowsHookEx(HookType.WH_KEYBOARD, hookProc, 0,
GetCurrentThreadId());

     }

     public int MyKeyboardProc(int nCode, int wParam, int lParam)
     {
          return 0;
     }
}


To install the hook procedure
Win32Hook hook = new Win32Hook();
hook.SetHook();