tutorial - ¿Cómo muevo una ventana de wpf a un valor superior negativo?
wpf vs winforms (1)
Si utilizo dragMove, la ventana wpf no se moverá a una ubicación donde el valor y sea negativo. Sin embargo, puedo establecer el valor superior de Windows a un valor negativo. ¿Hay una manera simple de habilitar dragMove para permitir que la parte superior de la ventana se mueva arriba de la posición de las pantallas 0?
Editar:
Parece que este es el manejo de la ventana predeterminada de moveWindow. Verificado con una llamada a SendMessage (hwnd, WM_SYSCOMMAND, SC_MOVE, null);
Como encontré, la ventana se moverá a la ubicación "negativa", pero luego saltará. Para evitar esto, podrías hacer algo como:
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));
}
}
Manejar WM_WINDOWPOSCHANGING de esta manera evitará cualquier movimiento de la ventana a menos que se presione el botón izquierdo del mouse. Esto también incluye maximizar la ventana y el cambio programático de la posición de la ventana, por lo que deberá adaptar el código si necesita otro comportamiento.