Как мне переместить окно wpf в отрицательное верхнее значение?

Если я использую dragMove, окно wpf не будет перемещаться в место, где значение y отрицательно. Однако я могу установить верхнее значение окна в отрицательное значение. Есть ли простой способ включить dragMove, чтобы верхняя часть окна могла перемещаться выше позиции 0 на экране?

Редактировать:

Похоже, что это обработка окна по умолчанию moveWindow. Проверено с помощью вызова SendMessage( hwnd, WM_SYSCOMMAND, SC_MOVE, null);

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 таким образом предотвратит любое перемещение окна, если не нажать левую кнопку мыши. Это включает в себя максимизацию окна и программное изменение положения окна, поэтому вам придется адаптировать код, если вам нужно другое поведение.

Другие вопросы по тегам