用C#做键盘钩子和鼠标钩子都可以,全局和线程的都没问题,可是做WH_GETMESSAGE总是不成功,用C++可以,但是翻译成C#就不行了。安装钩子是成功的,但是钩子委托只会执行一次,不知道是什么原因。已下代码放是放在dll中的
public class MyHook
{
const int WH_GETMESSAGE=3; [DllImport("user32.dll")]
public static extern IntPtr SetWindowsHookEx(int hookType,HookProc hookProc,IntPtr instance,int threadID);
[DllImport("user32.dll")]
public static extern IntPtr CallNextHookEx(IntPtr hookHandle, int nCode, IntPtr wParam, IntPtr lParam); public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); static IntPtr hookHandle=IntPtr.Zero;//钩子的句柄 /// <summary>
/// 安装钩子
/// </summary>
/// <returns></returns>
public static bool SetHook()
{
IntPtr h=Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]);
hookHandle = SetWindowsHookEx(WH_GETMESSAGE,new HookProc(HookCallBack),h,0);
if(hookHandle==IntPtr.Zero)
{
System.Windows.Forms.MessageBox.Show("安装失败了");
return false;
}
return true;
}
public static IntPtr HookCallBack(int nCode,IntPtr wParam,IntPtr lParam)
{
System.Diagnostics.Debug.WriteLine("有消息近来了");//只会执行一次 if(nCode < 0)
{
CallNextHookEx(hookHandle,nCode,wParam,lParam);
return IntPtr.Zero;
}
else
{
return CallNextHookEx(hookHandle,nCode,wParam,lParam);
}
}
}谁.Net做出消息钩子的共享一下代码,不胜感激

解决方案 »

  1.   

    有可能WH_GETMESSAGE消息是在钩子处理之前处理的,
    毕竟window系统是要控制你安装的钩子的
      

  2.   

    我在.NET3.5的WPF项目中钩过,不过不是全局勾。待会儿试试.NET2.0下的,成功了就发给你。
      

  3.   

    http://blog.csdn.net/huwei2003/archive/2008/10/24/3136787.aspx
    请看看有没有你要的信息
      

  4.   

    fuyuxin19801120:我要钩的是其它进程的消息,重写WndProc()达不到效果 
      

  5.   

    linaren:我认为windows是先处理消息钩子的,因为当钩到键盘消息时甚至可以修改键值,而键盘钩子却修改不了,这也是我选择消息钩子的一个原因。看看这个帖子http://topic.csdn.net/u/20070416/18/d6e3c52b-ed7d-4591-99d8-dbaa82b2f8bc.html
      

  6.   

    对于全局消息hook, .Net只能Hook鼠标键盘消息. 不能hook其他进程.因为.Net托管代码的dll不能注入到非托管代码的进程里面. 所以不能hook其他进程的消息.
      

  7.   


    hook其他线程的消息, 实质工作原理就是将dll注入到其他线程, 所以你才能hook到.而.net的dll由于是托管代码, 是不能注入到native code的线程中的. 所以, 你的需求纯.net是无能为力的.之所以能hook到鼠标键盘, 那是因为这两个是特殊消息, 并不属于用户态某个线程所有.
      

  8.   

    接帖了
    最后问一下shrinerain :
    是不是鼠标和键盘钩子只能做全局的,而不能做线程钩子去钩非托管程序的线程?