将鼠标消息发送给指定的父控件_勾子

以下类通过挂载勾子原理,实现将子控件鼠标消息发送给父控件。

 

调用:

MousePreview mp=new MousePreview(pControl);  //pControl为父控件

//启用勾子

mp.EnableHook();

 

//禁用勾子

mp.DisableHook();

 

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

using System.Drawing;

using System.Windows.Forms;

 

 

    public class MousePreview

    {

        /// <summary>

        /// Hook管理器

        /// </summary>

        GCHandle mGC;

 

        [DllImport("kernel32")]

        public static extern int GetCurrentThreadId();

 

        /// <summary>

        /// 挂载勾子

        /// </summary>

        /// <param name="idHook"></param>

        /// <param name="lpfn"></param>

        /// <param name="hmod"></param>

        /// <param name="dwThreadId"></param>

        /// <returns></returns>

        [DllImport("user32", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

        public static extern IntPtr  SetWindowsHookEx(int idHook, HOOKPROC lpfn, int hmod, int dwThreadId);

 

        /// <summary>

        /// 卸载勾子

        /// </summary>

        /// <param name="hhook"></param>

        /// <returns></returns>

        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]

        public static extern bool UnhookWindowsHookEx(IntPtr hhook);

 

        /// <summary>

        /// 发送消息

        /// </summary>

        /// <param name="hwnd"></param>

        /// <param name="wMsg"></param>

        /// <param name="wParam"></param>

        /// <param name="lParam"></param>

        /// <returns></returns>

        [DllImport("user32.dll", EntryPoint = "SendMessage")]

        public static extern IntPtr  SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

 

        public delegate int HOOKPROC(int nCode, int wParam, int lParam);

 

        private Control mControl;

        private IntPtr mHook=IntPtr.Zero;

        /// <summary>

        /// 构造

        /// </summary>

        /// <param name="pControl"></param>

        public MousePreview(Control pControl)

        {

            mControl = pControl;

        }

 

        /// <summary>

        /// 启用挂勾子

        /// </summary>

        public void EnableHook()

        {

            if (mHook == IntPtr.Zero)

            {

                HOOKPROC proc = new HOOKPROC(MyMouseProc);

                mGC=GCHandle .Alloc(proc);

                mHook = SetWindowsHookEx(7, proc, 0, GetCurrentThreadId());

            }

        }

 

        /// <summary>

        ///

        /// </summary>

        public void DisableHook()

        {

            if (mHook != IntPtr.Zero)

            {

                UnhookWindowsHookEx(mHook);

                mGC.Free();                

            }

            mHook = IntPtr.Zero;

        }

 

        /// <summary>

        /// 处理消息事件

        /// </summary>

        /// <param name="nCode"></param>

        /// <param name="wParam"></param>

        /// <param name="lParam"></param>

        /// <returns></returns>

        private  int MyMouseProc(int nCode, int wParam, int lParam)

        {

            if (nCode == 0)

            {

                GC.Collect();

                GC.WaitForPendingFinalizers();

                GC.Collect();

 

                Rectangle _Rect = mControl.RectangleToScreen(mControl.ClientRectangle);

                if (!_Rect.Contains(Cursor.Position)) return 0;

 

                short _X = (short)(Cursor.Position.X - _Rect.X);

                short _Y = (short)(Cursor.Position.Y - _Rect.Y);

 

                int _Point = _Y << 16;

                _Point += _X;

               

                switch (wParam)

                {

                    case 0x200: //移动鼠标

                    case 0x201:  //按下左键

                    case 0x202:  //释放左键

                    case 0x203:  //双击左键

                    case 0x204:  //按下右键

                    case 0x205:  //释放右键

                    case 0x206:  //双击右键

                    case 0x207:  //按下中键

                    case 0x208:  //释放中键

                    case 0x209:   //双击中键

                        SendMessage(mControl.Handle, wParam, wParam, _Point);

                        break;

                        /*

                    case 512:

                        SendMessage(mControl.Handle, 512, wParam, _Point);

                        break;

                    case 513:

                        SendMessage(mControl.Handle, 513, wParam, _Point);

                        break;

                    case 514:

                        SendMessage(mControl.Handle, 514, wParam, _Point);

                        break;

                    case 516:

                        SendMessage(mControl.Handle, 516, wParam, _Point);

                        break;

                    case 517:

                        SendMessage(mControl.Handle, 517, wParam, _Point);

                        break;

                         */

                    default:

                        break;

                }

            }

            return 0;

        }

 

    }

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值