代码如下:
    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;
        }
    }
这里我没有多次安装

解决方案 »

  1.   

    为什么把钩子放到button里啊
    那不是每点一次,都安装一次么...
      

  2.   

    是这样的,我就点击一下按钮,我也尝试放在Load事件里面,但仍然还会有那种进入两次的现象
      

  3.   

    是会触发两次,你加一个判断就行if (nCode == 0)
    {
            
    }
      

  4.   

    是的,我最后就是加判断解决的,只是想知道是什么原因造成的还是钩子的机制决定的呢查 msdn 啊,看里面对 nCode 参数的解释
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms644975%28v=vs.85%29.aspx
      

  5.   

    是的,我最后就是加判断解决的,只是想知道是什么原因造成的还是钩子的机制决定的呢
    查 msdn 啊,看里面对 nCode 参数的解释
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms644975%28v=vs.85%29.aspx

    看了,没有找到什么原因,你看出什么原因了吗?请指教
      

  6.   

    有一定的进展了,SPY++发现进入窗口消息只进入一次,但是在代码中会响应两次,
      

  7.   

    if(::PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE))
    {
    ::GetMessage(&msg, NULL, 0, 0);
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
      

  8.   

    最后一次顶了,那个,有一个新的发现,我下断点,发现两次进入钩子过程时,发现第一次进入钩子,目标窗体是Form的,第二次进入时目标窗体是子控件,至于是哪个子控件,点击的哪个控件就是哪个控件,我是看Handle时发现的,不知道有没有人遇到这情况 ,