?
Solved

win32 hook - easy

Posted on 2003-12-05
12
Medium Priority
?
753 Views
Last Modified: 2008-02-01
here is my code for a local windows hook, the important bit is maked with commentary:


                      [DllImport("user32.dll")]
            public static extern long SetWindowsHookEx(long idHook,long lpfn,long hmod,long dwThreadId);

            [DllImport("user32.dll")]
            public static extern long CallNextHookEx(long idHook,long ncode,long wParam,long lParam);

            [DllImport("user32.dll")]
            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)
            {
                  MessageBox.Show("D");
                  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)
            {
                  UnhookWindowsHookEx(hHook);
            }

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

0
Comment
Question by:dear_jimmy
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
12 Comments
 
LVL 48

Accepted Solution

by:
AlexFM earned 150 total points
ID: 9887445
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:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Hooks/HookReference/HookFunctions/KeyboardProc.asp

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.
0
 

Author Comment

by:dear_jimmy
ID: 9887923
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
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 48

Expert Comment

by:AlexFM
ID: 9888462
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.
0
 

Author Comment

by:dear_jimmy
ID: 9889995
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# :(
0
 

Author Comment

by:dear_jimmy
ID: 9890051
also no matter what type of varible lfpn is, it cannot convert type Local_Keyboard_Hook.Form1.HookDelegate to the same type as lfpn...
0
 

Author Comment

by:dear_jimmy
ID: 9890967
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.
0
 
LVL 48

Expert Comment

by:AlexFM
ID: 9891445
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),
      IntPtr.Zero,
      (int) AppDomain.GetCurrentThreadId());
}

This code is taken from the demo project from the article pointed by my first post.
0
 

Author Comment

by:dear_jimmy
ID: 9893855
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
0
 
LVL 20

Assisted Solution

by:TheAvenger
TheAvenger earned 120 total points
ID: 9895079
Change your Win32 function declarations and types to what is given in the article provided by AlexFM. You can find them all here:

http://msdn.microsoft.com/msdnmag/issues/02/10/CuttingEdge/figures.asp#fig2

Then you will be able to compile.
0
 
LVL 1

Expert Comment

by:suma_ds
ID: 9899837
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
0
 

Author Comment

by:dear_jimmy
ID: 9899846
opps i used wrong account ^
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
Performance in games development is paramount: every microsecond counts to be able to do everything in less than 33ms (aiming at 16ms). C# foreach statement is one of the worst performance killers, and here I explain why.
In this brief tutorial Pawel from AdRem Software explains how you can quickly find out which services are running on your network, or what are the IP addresses of servers responsible for each service. Software used is freeware NetCrunch Tools (https…
In this video, Percona Solution Engineer Rick Golba discuss how (and why) you implement high availability in a database environment. To discuss how Percona Consulting can help with your design and architecture needs for your database and infrastr…
Suggested Courses
Course of the Month10 days, 2 hours left to enroll

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question