【问题标题】:How do I move a wpf window into a negative top value?如何将 wpf 窗口移动到负值?
【发布时间】:2010-09-24 14:17:36
【问题描述】:

如果我使用 dragMove,wpf 窗口将不会移动到 y 值为负的位置。但是,我可以将窗口顶部值设置为负值。是否有一种简单的方法可以启用 dragMove 以允许将窗口顶部移动到显示 0 位置上方?

编辑:

看来这是默认窗口对moveWindow的处理。通过调用 SendMessage(hwnd, WM_SYSCOMMAND, SC_MOVE, null); 进行验证

【问题讨论】:

    标签: wpf


    【解决方案1】:

    我发现,窗口将移动到“负”位置,但随后会跳回。为了防止这种情况,您可以执行以下操作:

    public partial class Window1: Window {
    
        public Window1() {
            InitializeComponent();
        }
    
        private void Window_MouseDown(object sender, MouseButtonEventArgs e) {
            DragMove();
        }
    
        public struct WINDOWPOS {
            public IntPtr hwnd;
            public IntPtr hwndInsertAfter;
            public int x;
            public int y;
            public int cx;
            public int cy;
            public UInt32 flags;
        };
    
        private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) {
            switch(msg) {
                case 0x46://WM_WINDOWPOSCHANGING
                    if(Mouse.LeftButton != MouseButtonState.Pressed) {
                        WINDOWPOS wp = (WINDOWPOS)Marshal.PtrToStructure(lParam, typeof(WINDOWPOS));
                        wp.flags = wp.flags | 2; //SWP_NOMOVE
                        Marshal.StructureToPtr(wp, lParam, false);
                    }
                    break;
            }
            return IntPtr.Zero;
        }
    
        private void Window_Loaded(object sender, RoutedEventArgs e) {
            HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
            source.AddHook(new HwndSourceHook(WndProc));
        }        
    }
    

    以这种方式处理 WM_WINDOWPOSCHANGING 将阻止窗口的任何移动,除非按下鼠标左键。这包括最大化窗口和窗口位置的编程更改,因此如果您需要其他行为,则必须调整代码。

    【讨论】:

      猜你喜欢
      • 2017-07-12
      • 1970-01-01
      • 2016-02-27
      • 2013-05-12
      • 2011-03-23
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多