none
关于winform中Windows消息的问题 RRS feed

  • 问题

  • winform中能否只针对窗体中的某一个控件来进行过滤Windows消息啊?

    比如,我想过滤A控件的点击事件,也就是说我想让点击A控件不会触发点击事件,而且也没有反应,也不做任何响应。的同时点击B控件时,可以触发B控件的点击事件。我的这种套路可行吗?求教各位路过的大神。在此O(∩_∩)O谢过!

    2017年10月21日 7:06

全部回复


  • Hi TheYangtze,

    >>比如,我想过滤A控件的点击事件,也就是说我想让点击A控件不会触发点击事件,而且也没有反应,也不做任何响应。的同时点击B控件时,可以触发B控件的点击事件。我的这种套路可行吗?求教各位路过的大神。在此O(∩_∩)O谢过!

    并没有特别的方法,你可以使用IMessageFilter来过滤窗体的消息,针对你需要的button来选择性忽略鼠标点击事件。

       public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
                MessageFilter f = new MessageFilter();
                Application.AddMessageFilter(f);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                MessageBox.Show("button2 ");
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                MessageBox.Show("button2 ");
            }
        }
    
        public class MessageFilter : IMessageFilter
        {
    
            public MessageFilter()
            {
    
            }
    
            public bool PreFilterMessage(ref Message msg)
            {
                Control c = Control.FromHandle(msg.HWnd);
                if (c == null)
                    System.Diagnostics.Debug.WriteLine("Filter:NULL" + "-" + msg.ToString());
                else if(c is Button)
                {
                    if (c.Name == "button1")
                    {
                        //不响应鼠标左键消息
                        if (msg.Msg >= 513 && msg.Msg <= 515)
                        {
                            return true;////吞掉消息,不派发
                        }
                    }
                }
                return false;//进入下一步派发到对应窗口过程
            }
        }


    IMessageFilter 接口:
    https://msdn.microsoft.com/zh-cn/library/system.windows.forms.imessagefilter(v=vs.110).aspx

    Message.Msg 属性:
    https://msdn.microsoft.com/zh-cn/library/system.windows.forms.message.msg(v=vs.110).aspx


    Best Regards,

    Yohann Lu



    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年10月23日 9:08
    版主