2008-11-29 47 views
4

如果我使用dragMove,wpf窗口将不会移动到y值为负的位置。但是,我可以将窗口顶部的值设置为负值。有没有简单的方法来启用dragMove允许窗口的顶部被移动到显示器0位置之上?如何将wpf窗口移至负值最高值?

编辑:

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

回答

6

正如我发现,窗口将移动到“负”的位置,但会跳回来。为了防止这种情况,你可以这样做:

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这样会阻止窗口的任何运动,除非鼠标左键按下。这包括最大化窗口位置的窗口和程序化更改,因此如果需要其他行为,则必须修改代码。