用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做出消息钩子的共享一下代码,不胜感激
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做出消息钩子的共享一下代码,不胜感激
毕竟window系统是要控制你安装的钩子的
请看看有没有你要的信息
hook其他线程的消息, 实质工作原理就是将dll注入到其他线程, 所以你才能hook到.而.net的dll由于是托管代码, 是不能注入到native code的线程中的. 所以, 你的需求纯.net是无能为力的.之所以能hook到鼠标键盘, 那是因为这两个是特殊消息, 并不属于用户态某个线程所有.
最后问一下shrinerain :
是不是鼠标和键盘钩子只能做全局的,而不能做线程钩子去钩非托管程序的线程?