代码如下:
public partial class Form1 : Form
{
MOUSEHOOK mouseHook = new MOUSEHOOK();
MOUSEHOOK.HookHandle hookhandle = null;
public Form1()
{
InitializeComponent();
}
//这是安装钩子
private void button1_Click(object sender, EventArgs e)
{
hookhandle = new MOUSEHOOK.HookHandle(HookProc);
mouseHook.InstallHook(hookhandle);
}
MOUSEHOOK.MouseHookStruct mhs = new MOUSEHOOK.MouseHookStruct();
//钩子过程
int HookProc(int nCode, int wParam, IntPtr lParam)
{
Marshal.PtrToStructure(lParam, mhs);
switch (wParam)
{
case MOUSEHOOK.WM_LBUTTONUP:
Console.WriteLine("进入几次呢?");
break;
default :
break;
} return MOUSEHOOK.CallNextHookEx(mouseHook.hhook, nCode, wParam, lParam);
} }
//钩子类
public class MOUSEHOOK
{
[DllImport("user32.dll")]
private static extern int SetWindowsHookEx(int idHook, HookHandle HookProc, IntPtr hMod, int dwThreadId);
//取消钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern bool UnhookWindowsHookEx(int idHook);
//调用下一个钩子
[DllImport("user32.dll")]
public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
} public const int WH_MOUSE = 7;
public const int WM_MOUSEMOVE = 0x200;
public const int WM_LBUTTONDOWN = 0x201;
public const int WM_LBUTTONUP = 0x202;
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int WM_NCLBUTTONUP = 0xA2;
public const int WM_NCMOUSEMOVE = 0xA0;
public MouseHookStruct mhs = new MouseHookStruct();
public int hhook;
public delegate int HookHandle(int nCode, int wParam, IntPtr lParam); public bool InstallHook(HookHandle MouseProc)
{
hhook = SetWindowsHookEx(WH_MOUSE, MouseProc, IntPtr.Zero, AppDomain.GetCurrentThreadId());//AppDomain.GetCurrentThreadId()
if (hhook != 0)
return true;
return false;
}
public void UnInstallHook()
{
bool ret = false;
if (hhook != 0)
ret = UnhookWindowsHookEx(hhook);
if (ret)
hhook = 0;
}
}
这里我没有多次安装
public partial class Form1 : Form
{
MOUSEHOOK mouseHook = new MOUSEHOOK();
MOUSEHOOK.HookHandle hookhandle = null;
public Form1()
{
InitializeComponent();
}
//这是安装钩子
private void button1_Click(object sender, EventArgs e)
{
hookhandle = new MOUSEHOOK.HookHandle(HookProc);
mouseHook.InstallHook(hookhandle);
}
MOUSEHOOK.MouseHookStruct mhs = new MOUSEHOOK.MouseHookStruct();
//钩子过程
int HookProc(int nCode, int wParam, IntPtr lParam)
{
Marshal.PtrToStructure(lParam, mhs);
switch (wParam)
{
case MOUSEHOOK.WM_LBUTTONUP:
Console.WriteLine("进入几次呢?");
break;
default :
break;
} return MOUSEHOOK.CallNextHookEx(mouseHook.hhook, nCode, wParam, lParam);
} }
//钩子类
public class MOUSEHOOK
{
[DllImport("user32.dll")]
private static extern int SetWindowsHookEx(int idHook, HookHandle HookProc, IntPtr hMod, int dwThreadId);
//取消钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern bool UnhookWindowsHookEx(int idHook);
//调用下一个钩子
[DllImport("user32.dll")]
public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
} public const int WH_MOUSE = 7;
public const int WM_MOUSEMOVE = 0x200;
public const int WM_LBUTTONDOWN = 0x201;
public const int WM_LBUTTONUP = 0x202;
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int WM_NCLBUTTONUP = 0xA2;
public const int WM_NCMOUSEMOVE = 0xA0;
public MouseHookStruct mhs = new MouseHookStruct();
public int hhook;
public delegate int HookHandle(int nCode, int wParam, IntPtr lParam); public bool InstallHook(HookHandle MouseProc)
{
hhook = SetWindowsHookEx(WH_MOUSE, MouseProc, IntPtr.Zero, AppDomain.GetCurrentThreadId());//AppDomain.GetCurrentThreadId()
if (hhook != 0)
return true;
return false;
}
public void UnInstallHook()
{
bool ret = false;
if (hhook != 0)
ret = UnhookWindowsHookEx(hhook);
if (ret)
hhook = 0;
}
}
这里我没有多次安装
那不是每点一次,都安装一次么...
{
}
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644975%28v=vs.85%29.aspx
查 msdn 啊,看里面对 nCode 参数的解释
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644975%28v=vs.85%29.aspx
看了,没有找到什么原因,你看出什么原因了吗?请指教
{
::GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}