现在有两个窗体A和B,B窗体是透明的,并且在最前面.如果在B窗体区域点击鼠标, 会把消息直接传到A窗体上,
请问有没有方法可以拦截透明窗体B的鼠标消息, 使其不能直接透到A窗体上呢.

解决方案 »

  1.   

    你指什么消息会传递到A,如果用ShowDialog显示,不会的
      

  2.   

    比如说A窗体上有个按钮btn, 那么当B窗体显示在前面的时候, 因为是透明的,可以看到A窗体上的btn,这时点击btn,能够进入到btn的消息处理函数. 我的需求是此时btn不接受鼠标消息. 只有A窗体显示在最前面时才让其接受鼠标消息,进入到btn的消息处理函数中.
      

  3.   

    第一种:
    API:
          
    [DllImport("user32.dll" , EntryPoint = "ShowCursor" , CharSet = CharSet.Auto)]
    public static extern void ShowCursor(int status);
    status:0/1 :隐藏/显示
    ==================================================================
    第二种:
    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    namespace WindowsApplication5
    {
        public partial class Form1 : Form
        {
            /// <summary>
            /// 获取鼠标闲置时间
            /// </summary>
            [StructLayout(LayoutKind.Sequential)]
            public struct LASTINPUTINFO
            {
                [MarshalAs(UnmanagedType.U4)]
                public int cbSize;
                [MarshalAs(UnmanagedType.U4)]
                public uint dwTime;
            }
            /// <summary>
            /// 获取鼠标闲置时间
            /// </summary>
            /// <param name="plii"></param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            public static extern bool GetLastInputInfo(ref   LASTINPUTINFO plii);        /// <summary>
            /// 设置鼠标状态的计数器(非状态)
            /// </summary>
            /// <param name="bShow">状态</param>
            /// <returns>状态技术</returns>
            [DllImport("user32.dll", EntryPoint = "ShowCursor", CharSet = CharSet.Auto)]
            public static extern int ShowCursor(bool bShow);
            public Form1()
            {
                InitializeComponent();
                //定时期
                System.Windows.Forms.Timer timer = new Timer();
                timer.Enabled = true;
                timer.Interval = 100;
                timer.Tick += new EventHandler(timer_Tick);        }
            //鼠标状态计数器
            int iCount = 0;
            void timer_Tick(object sender, EventArgs e)
            {
                //鼠标状态计数器>=0的情况下鼠标可见,<0不可见,并不是直接受api函数影响而改变
                long i=getIdleTick() ;
                if (i > 5000)
                {
                    while (iCount >= 0)
                    {
                        iCount=ShowCursor(false);
                    }
                }
                else
                {
                    while (iCount < 0)
                    {
                        iCount = ShowCursor(true);
                    }
                }
            }
            /// <summary>
            /// 获取闲置时间
            /// </summary>
            /// <returns></returns>
            public long getIdleTick()
            {
                LASTINPUTINFO vLastInputInfo = new LASTINPUTINFO();
                vLastInputInfo.cbSize = Marshal.SizeOf(vLastInputInfo);
                if (!GetLastInputInfo(ref   vLastInputInfo)) return 0;
                return Environment.TickCount - (long)vLastInputInfo.dwTime;
            }       
        }
    }
    ============================================================================
    第三种:
                Cursor.Hide();
                Cursor.Show();
      

  4.   

    1 用showDialog。
    2 100%改为一个比较小的值,但是不是0.
      

  5.   

    可能大家还没明白我的真正用意啊!!!在表述一下吧比如说A窗体上有个按钮btn, 那么当B窗体显示在前面的时候, 因为是透明的,可以看到A窗体上的btn,这时点击btn,能够进入到btn的消息处理函数. 我的需求是此时btn不接受鼠标消息, 但是B窗体仍然能够接收鼠标消息, 比如说此时我可以用鼠标在B窗体上画图形或者手写字体(当然用非透明色)等等。
    只有A窗体显示在最前面时才让其接受鼠标消息,进入到btn的消息处理函数中.
      

  6.   

    问下楼主用什么属性设置窗体透明,使鼠标透过透明窗体。我用Opacity属性设的没这效果。
      

  7.   

    因为已经完全透明了.所以就穿透了.可以设置透明度为1%,或者Graphics.FillRectangle填充一层Color.Fromargb(1,255,255,255)虽然看起来还是透明的,但实际已经不穿透了.
      

  8.   

    设置透明度为1%这个方法试过了,不好用!!!!
    “Graphics.FillRectangle填充一层Color.Fromargb(1,255,255,255)”这个方法没太明白亚, 能不能结合代码大概说下呢, 非常感谢哦。最好有个完整的sample代码哦
      

  9.   

    设置透明度为1%这个方法试过了,不好用!!!!
    “Graphics.FillRectangle填充一层Color.Fromargb(1,255,255,255)”这个方法没太明白亚, 能不能结合代码大概说下呢, 非常感谢哦。最好有个完整的sample代码哦
      

  10.   

    将窗体透明度设置为1(SetLayeredWindowAttributes或者UpdateLayeredWindow)可以接收消息,但是发现个别机器有不好使的情况。