当前位置:编程学习 > C#/ASP.NET >>

C# 控件怎么过滤键盘和鼠标点击事件呢

遇到一个问题
在一个winform窗口中有很多控件,我在他们的最上层铺了一张背景透明的图片,我希望用户点击时窗口中的控件还能够正常响应,我应该怎么做,
请高手们给出具体的实现方式,最好有代码

谢谢 winform --------------------编程问答-------------------- 图片的点击事件中,根据坐标,去找窗体中其他控件,看看谁包含这个坐标,然后执行那个组件的click,或者自己拦截消息 wndproc或者用消息过滤器 --------------------编程问答-------------------- 可以用鼠标/键盘钩子 --------------------编程问答-------------------- 首先,谢谢大家
1、图片的点击事件中,根据坐标,去找窗体中其他控件,看看谁包含这个坐标,然后执行那个组件的click,这个方案不可行,因为窗口中的控件非常复杂,不光有点击事件,还有拖动操作。
2、关于使用拦截消息 wndproc、消息过滤器和钩子的方案,我都试了一下,但是都没有成功
不知道能否给出关键代码,我的实现方式如下
  public class MousePreview
    {

        [DllImport("kernel32")]
        public static extern int GetCurrentThreadId();
        [DllImport("user32", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int SetWindowsHookEx(int idHook, HOOKPROC lpfn, int hmod, int dwThreadId);
        [DllImport("user32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
        public delegate int HOOKPROC(int nCode, int wParam, int lParam);
        private Control m_Control;

        public MousePreview(Control p_Control)
        {
            SetWindowsHookEx(7, new HOOKPROC(MyMouseProc), 0, GetCurrentThreadId());
            m_Control = p_Control;
        }

        public int MyMouseProc(int nCode, int wParam, int lParam)
        {
            if (nCode == 0)
            {
                Console.WriteLine(nCode.ToString());
                Rectangle _Rect = m_Control.RectangleToScreen(m_Control.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 512:
                        SendMessage(m_Control.Handle, 512, wParam, _Point);
                        break;
                    case 513:
                        SendMessage(m_Control.Handle, 513, wParam, _Point);
                        break;
                    case 514:
                        SendMessage(m_Control.Handle, 514, wParam, _Point);
                        break;
                    case 516:
                        SendMessage(m_Control.Handle, 516, wParam, _Point);
                        break;
                    case 517:
                        SendMessage(m_Control.Handle, 517, wParam, _Point);
                        break;
                    default:
                        break;
                }
            }
            return 0;
}
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,