C# 的HOOK问题
要做一个hook进程的程序,所搜到了鼠标键盘的,但是创建安装hook的时候返回都是0(安装失败),什么原因,我看源代码是 framework 3.5 用vs2008打不开 用vs2012打开可以正常运行钩子也正常,我改成2.0的还是可以正常运行,但是一样的代码到了vs2008环境下我自己新建的项目就不能用,钩子返回就变成0.大家有什么想法,
下面是我的钩子代码,欢迎指正,是一个单纯的鼠标钩子:
这里是form后台
namespace dis_pose
{
public partial class testHook : Form
{
public testHook()
{
InitializeComponent();
}
private GlobalHook hook;
[DllImport("user32")]
private static extern IntPtr GetForegroundWindow();
private void testHook_Load(object sender, EventArgs e)
{
hook = new GlobalHook();
hook.OnMouseActivity += new MouseEventHandler(this.MyMouseClick);
hook.Start();
}
private void MyMouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
this.textBox1.Text += "坐标:X= " + e.X + " Y=" + e.Y + "--------";
}
private void testHook_FormClosing(object sender, FormClosingEventArgs e)
{
if (hook != null)
hook.Stop();
}
}
}
下面是hook类:
namespace dis_pose
{
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct //鼠标钩子结构管理
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}
public class GlobalHook
{
//安装钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, GlobalHookProc lpfn,
IntPtr hInstance, int threadId);
//进行到下一步
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode,
Int32 wParam, IntPtr lParam);
//卸载钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
public event MouseEventHandler OnMouseActivity;//鼠标事件
static int hMouseHook = 0;//钩子句柄为int
public delegate int GlobalHookProc(int nCode, Int32 wParam, IntPtr lParam);
public delegate int HookProc(int code, Int32 wparm, IntPtr iparem);
GlobalHookProc MouseHookProcedure; //委托实例
public GlobalHook()
{
Start();
}
~GlobalHook()
{
Stop();
}
public const int WH_MOUSE_LL = 14;//常数
public void Start()
{
if (hMouseHook == 0)
{
MouseHookProcedure = new GlobalHookProc(MouseHookProc);//实例化委托
hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);//得钩子句柄过程
if (hMouseHook == 0)
Stop();//写入钩子失败
}
}
public void Stop()
{
bool retMouse = true;
if (hMouseHook != 0)
{
retMouse = UnhookWindowsHookEx(hMouseHook);
hMouseHook = 0;
}
}
private const int WM_LBUTTONDOWN = 0x201;//左
private const int WM_RBUTTONDOWN = 0x204;//右
private const int WM_LBUTTONDBLCLK = 0x203;//左双击
private const int WM_RBUTTONDBLCLK = 0x206;//右双击
private int MouseHookProc(int ncode, Int32 wparam, IntPtr iparam)
{
if (ncode >= 0 && OnMouseActivity != null)
{
MouseButtons button = MouseButtons.None;
switch (wparam)
{
case WM_LBUTTONDOWN:
button = MouseButtons.Left;
break;
case WM_RBUTTONDOWN:
button = MouseButtons.Right;
break;
}
int clickcount = 0;
if (button != MouseButtons.None)
if (wparam == WM_LBUTTONDBLCLK || wparam == WM_RBUTTONDBLCLK)
clickcount = 2;
else
clickcount = 1;
MouseHookStruct myMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(iparam, typeof(MouseHookStruct));
MouseEventArgs e = new MouseEventArgs(button,clickcount,myMouseHookStruct.pt.x,myMouseHookStruct.pt.y,0);
OnMouseActivity(this, e);
}
return CallNextHookEx(hMouseHook, ncode, wparam, iparam);
}
}
}
重点是 如何hook NTcreateProcessEx ,愁