4
如果我使用dragMove,wpf窗口将不会移动到y值为负的位置。但是,我可以将窗口顶部的值设置为负值。有没有简单的方法来启用dragMove允许窗口的顶部被移动到显示器0位置之上?如何将wpf窗口移至负值最高值?
编辑:
看来,这是的MoveWindow的默认窗口的处理。通过调用SendMessage(hwnd,WM_SYSCOMMAND,SC_MOVE,null)进行验证;
如果我使用dragMove,wpf窗口将不会移动到y值为负的位置。但是,我可以将窗口顶部的值设置为负值。有没有简单的方法来启用dragMove允许窗口的顶部被移动到显示器0位置之上?如何将wpf窗口移至负值最高值?
编辑:
看来,这是的MoveWindow的默认窗口的处理。通过调用SendMessage(hwnd,WM_SYSCOMMAND,SC_MOVE,null)进行验证;
正如我发现,窗口将移动到“负”的位置,但会跳回来。为了防止这种情况,你可以这样做:
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这样会阻止窗口的任何运动,除非鼠标左键按下。这包括最大化窗口位置的窗口和程序化更改,因此如果需要其他行为,则必须修改代码。