win32 hook - easy

here is my code for a local windows hook, the important bit is maked with commentary:

            public static extern long SetWindowsHookEx(long idHook,long lpfn,long hmod,long dwThreadId);

            public static extern long CallNextHookEx(long idHook,long ncode,long wParam,long lParam);

            public static extern long UnhookWindowsHookEx(long hHook);            
            public const int WH_KEYBOARD=2;      
            public long hHook;
            public long Keypress(long idHook,long wParam,long lParam)
                  return CallNextHookEx(hHook,idHook,wParam,lParam);

            private void button1_Click(object sender, System.EventArgs e)
                  hHook=SetWindowsHookEx(WH_KEYBOARD,0,0,0);//ERROR in last 3 values should be: address, wParam, lParam in that order

            private void button2_Click(object sender, System.EventArgs e)

my question:

1) how do i say that the 'address' is the function "Keypress"?
2) what do wParam and lParam do?
2) what values are required for wParam and lParam?

note: ive already posted this in the programming section but i wanted to move it here and to put more points on it... if u answer this correctly i will also give u the 55 points i have on the other question in programming (its asked from my other account suma_ds)

thankz 4 readin... suma

Who is Participating?
AlexFMConnect With a Mentor Commented:
hHook=SetWindowsHookEx(WH_KEYBOARD, this.Keypress, IntPtr.Zero, AppDomain.GetCurrentThreadId());

Last two parameters of SetWindowsHookEx are not wParam and lParam. They are application handle and thread ID.
You can find description of wParam and lParam for Keypress function here:

I suggest you also to use Trace instead of message box inside of hook function. Hopok function should perform very fast, otherwise you can get unpredictable results.
dear_jimmyAuthor Commented:
so thats how its done... all good except i get this obvious error which i do not know what to do about:

Method 'Local_Keyboard_Hook.Form1.Keypress(long, long, long)' referenced without parentheses

surely i am not expected to assign values into the Keypress function??

and about the messagebox thing... its only there as a way for me to instantly see that the hook is working - i will be removing it when i get the code working

thanks again, suma
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

I think this should be done using delegate, something like:

public delegate long HookDelegate(long idHook,long wParam,long lParam);

hHook=SetWindowsHookEx(WH_KEYBOARD, new HookDelegate(this.Keypress), IntPtr.Zero, AppDomain.GetCurrentThreadId());

I just guess since I am not in VS .NET now. I can extract the exact code from MSDN sample, if necessary. Try this meanwhile.
dear_jimmyAuthor Commented:
well this should to work but i cant try it out as im having serous trouble with the type of varibles i use... clearly they cant all be longs
they r supposed to be:

HHOOK SetWindowsHookEx(
  int idHook,                
  HOOKPROC lpfn,        
  HINSTANCE hMod,      
  DWORD dwThreadId

but HOOKPROC, HINSTANCE, and DWORD do not exist in c# :(
dear_jimmyAuthor Commented:
also no matter what type of varible lfpn is, it cannot convert type Local_Keyboard_Hook.Form1.HookDelegate to the same type as lfpn...
dear_jimmyAuthor Commented:
the last post was screwed up:

public static extern int SetWindowsHookEx(int idHook,IntPtr lpfn,IntPtr hMod,int dwThreadId);

hHook=SetWindowsHookEx(WH_KEYBOARD,(IntPtr)new HookDelegate(this.Keypress),IntPtr.Zero,(int)AppDomain.GetCurrentThreadId());

here the value being assigned to lfpn is (IntPtr)new HookDelegate(this.Keypress) and this gives the error.
public delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);
IntPtr m_hhook;

int Keypress(int code, IntPtr wParam, IntPtr lParam)
   // ...

private void button1_Click(object sender, System.EventArgs e)
  // install hook
  m_hhook = SetWindowsHookEx(
      2,     // WH_KEYBOARD  see enum HookType from demo project
      new HookProc(this.KeyPress),
      (int) AppDomain.GetCurrentThreadId());

This code is taken from the demo project from the article pointed by my first post.
dear_jimmyAuthor Commented:
but can u compile this code because i cannot.

i am importing SetWindowsHookEx with the parameters: (int idHook,IntPtr lpfn,IntPtr hmod,int dwThreadId);

and i get the error message: Cannot convert type HookProc to IntPtr

if i change the lpfn parameter to a integer i get the message: Cannot convert type HookProc to int

i've heard  that every method has a signature but i dont know how to get it... maybe the lpfn needs the method's signature i dunno
TheAvengerConnect With a Mentor Commented:
Change your Win32 function declarations and types to what is given in the article provided by AlexFM. You can find them all here:

Then you will be able to compile.
thanks man... i discovered what it was: the address varible lfpn needed to be declared as a delegate not an int

this article helps a lot (with the other varibles) so ima split the points

laterz... suma
dear_jimmyAuthor Commented:
opps i used wrong account ^
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.