【问题标题】:How to prevent MouseUp event after DoubleClick on Window TitleBar in WPF?双击WPF中的窗口标题栏后如何防止MouseUp事件?
【发布时间】:2021-05-30 12:25:52
【问题描述】:

如果用户双击窗口标题栏以最大化窗口,则窗口将在第二次单击的 MouseDown 事件时最大化,但同一第二次单击时的 MouseUp 事件将由窗口中的一个控件注册现在在光标下并触发用户不想要的东西。 如何预防?

【问题讨论】:

  • 通常,在处理路由事件且事件源很重要时,您必须在代码隐藏中处理事件并过滤RotedEventArgs.Source 或RoutedEventArgs.OriginalSource 值。

标签: wpf


【解决方案1】:

这应该可以正常工作:

解决方案:

  //WNDPROC INTEROP
        private const int WM_NCLBUTTONDBLCLK = 0x00A3;

        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
            source.AddHook(WndProc);
        }

   private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        //TITLE BAR DOUBLE CLICK
        if (msg == WM_NCLBUTTONDBLCLK)
        {
            Console.WriteLine("titlebar double click  " + this.WindowState);

            //WINDOW ABOUT TO GET MAXIMIZED
            if (msg == WM_NCLBUTTONDBLCLK) 
                handleNextMouseup = true;

            else if (msg == 0x202) //  mouseup     
            {        
                if (handleNextMouseup) 
                    handled = true;      
                
                handleNextMouseup = false;     
            } 
        }

        return IntPtr.Zero;
    }

另一种可能的解决方案:

  //WNDPROC INTEROP
        private const int WM_NCLBUTTONDBLCLK = 0x00A3;

        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
            source.AddHook(WndProc);
        }

        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            //TITLE BAR DOUBLE CLICK
            if (msg == WM_NCLBUTTONDBLCLK)
            {
                Console.WriteLine("titlebar double click  " + this.WindowState);

                //WINDOW ABOUT TO GET MAXIMIZED
                if (this.WindowState == WindowState.Normal)
                {
                    fakehittestvisible = true;

                }
            }

            return IntPtr.Zero;
        }


        private bool fakehittestvisible = false;

        //ON PREVIEW MOUSE UP ABORT IF MIXIMIZING HAPPENED
        private void this_PreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
            if (fakehittestvisible)
            {
                e.Handled = true;
                fakehittestvisible = false;
                return;
            }

            fakehittestvisible = false;
            Console.WriteLine("this mouse up state is " + this.WindowState);
        }

【讨论】:

  • 这是个好主意,但我已将其简化为 if (msg == WM_NCLBUTTONDBLCLK) handleNextMouseup = true; else if (msg == 0x202) //mouseup { if (handleNextMouseup) handled = true; handleNextMouseup = false; } 如果您进行编辑,我会接受它
  • 您好,我没有发现处理的 WndProc 与 e.handled 一起处理任何窗口鼠标事件..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多