C# 钩子函数对鼠标和键盘的监控

 

 

 

 /// <summary>
        ///安装钩子
        /// </summary>
        /// <param name="idHook"></param>
        /// <param name="lpfn"></param>
        /// <param name="intPtr"></param>
        /// <param name="dwThreadId"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
       public static extern int  SetWindowsHookEx(int idHook, HOOKPROC lpfn, IntPtr intPtr, int dwThreadId);

        public delegate int HOOKPROC(int code,int param,IntPtr iparm);

        HOOKPROC KeyBoardProc;

        /// <summary>
        /// 卸载钩子
        /// </summary>
        /// <param name="idHook"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern int UnhookWindowsHookEx(int idHook);


        /// <summary>
        /// 传递给下一个钩子,要不然下一个钩子住不到
        /// </summary>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern int CallNextHookEx(int idHook,int code,Int32 param,IntPtr iparam);






        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string name);



        int mhHook;
        /// <summary>
        /// anzhuang gouzi 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            KeyBoardProc = new HOOKPROC(keyBordProc);
           // mhHook = SetWindowsHookEx(13, KeyBoardProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
            mhHook = SetWindowsHookEx(14, KeyBoardProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
        }

  
        int keyBordProc( int code, int param, IntPtr iparam)
      {
            
            
            
            KeyBoardHookitStruct kh = (KeyBoardHookitStruct)Marshal.PtrToStructure(iparam, typeof(KeyBoardHookitStruct));

            //键盘
            if (kh.vkcode == (int)Keys.F3 && param == 256)//256  按下  257  抬起
            {
                MessageBox.Show("按下F3");

            }
            if (kh.vkcode == (int)Keys.F4 && param == 256)//256  按下  257  抬起
            {
                MessageBox.Show("按下F4");

            }

            //// 鼠标
            //// 判断wParam的值来判断是哪个鼠标事件
            switch ((int)param)
            {
                case 513: // WM_LBUTTONDOWN
                    Debug.Write("Left Mouse Button Down");
                   // MessageBox.Show("按下左键");
                    break;
                case 514: // WM_LBUTTONUP
                    Debug.Write("Left Mouse Button Up");
                    //MessageBox.Show("松下左键");
                    break;
                case 516: // WM_RBUTTONDOWN
                    Debug.Write("Right Mouse Button Down");
                   // MessageBox.Show("按下右键");
                    break;
                case 517: // WM_RBUTTONUP
                    Debug.Write("Right Mouse Button Up");
                   // MessageBox.Show("松下右键");
                    break;
                    // ... 其他事件
            }

            Debug.Write("code=="+code+"kh.vkcode==" + kh.vkcode + "param=="+ param+ "iparam=="+ iparam+"\r\n");
            return CallNextHookEx(mhHook,code,param,iparam);
        }


        [StructLayout(LayoutKind.Sequential)]
        class KeyBoardHookitStruct
        {
            //键盘
            public int vkcode;//1-254  键盘码
            //public int time;
            //public int dwExtrainfo;

            //鼠标
            public Point Point;
            public uint mouseData;
            public uint flags;

            //共用
            public uint time;
            public IntPtr dwExtraInfo;

        }

        private void button2_Click(object sender, EventArgs e)
        {
            UnhookWindowsHookEx(mhHook);
        }
    }

  

参考文章

https://blog.csdn.net/greston/article/details/8243115

posted @ 2024-08-18 10:34  陌念  阅读(27)  评论(0)    收藏  举报