es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo mover otra ventana dentro de WPF mientras se está moviendo una.

He encontrado una solución que funciona con un proceso, pero quiero mover la MainWindow cuando se mueve mi otra ventana.

La solución siguiente funciona con procesos como el bloc de notas y lo mueve correctamente, pero ¿cómo puedo aplicar esto a la MainWindow?

private Process AppToMove = Process.Start("notepad.exe");
private void Window_LocationChanged(object sender, EventArgs e)
{
    if (AppToMove != null)
    {
        AppToMove.WaitForInputIdle();
    }
    var xx = Application.Current.MainWindow.Top;
    var yy = Application.Current.MainWindow.Left;
    var zz = Application.Current.MainWindow.Width;
    var zzz = Application.Current.MainWindow.Height;

    var answer = yy + zz + ((yy + zz) * 0);
    var answer2 = xx + zzz + ((xx + zzz) * .0) - zzz;

    int IntY = (int)answer;
    int IntX = (int)answer2;
    CustomMove(AppToMove, IntY, IntX, 375, 812);
}

public void CustomMove(Process process, int x, int y, int width, int height)
{
    MoveWindow(process.MainWindowHandle, x, y, width, height, true);
}

[DllImport("user32.dll", SetLastError = true)]
private static extern bool MoveWindow(IntPtr hWnd, int x, int y, int width, int height, bool repaint);

La MainWindow se puede mostrar con

MainWindow MW = new MainWindow();
MW.Show();

pero ¿cómo se puede mover desde la otra ventana?

¿O es más sencillo crear un proyecto secundario, separar los dos y llamar al proceso/archivo ejecutable desde el segundo proyecto después de la compilación?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para aplicar la solución a MainWindow, debes modificar el método CustomMove para que acepte un parámetro Window en lugar de un parámetro Process. Luego, en el controlador de eventos Window_LocationChanged, puedes pasar Application.Current.MainWindow como parámetro a CustomMove.

    Aquí tienes un fragmento de código actualizado:

    private void Window_LocationChanged(object sender, EventArgs e)
    {
        var appToMove = Application.Current.MainWindow;
        if (appToMove != null)
        {
            appToMove.WaitForInputIdle();
        }
    
        var x = appToMove.Top;
        var y = appToMove.Left;
        var width = appToMove.Width;
        var height = appToMove.Height;
    
        var answer = y + width + ((y + width) * 0);
        var answer2 = x + height + ((x + height) * .0) - height;
    
        int intY = (int)answer;
        int intX = (int)answer2;
        CustomMove(appToMove, intX, intY, 375, 812);
    }
    
    public void CustomMove(Window window, int x, int y, int width, int height)
    {
        IntPtr hWnd = new WindowInteropHelper(window).Handle;
        MoveWindow(hWnd, x, y, width, height, true);
    }
    
    // Llamada a la DLL para hacer que 'MoveWindow' sea funcional
    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool MoveWindow(IntPtr hWnd, int x, int y, int width, int height, bool repaint);
    

    Puedes llamar a MainWindow desde otra ventana utilizando el mismo código que proporcionaste:

    MainWindow mw = new MainWindow();
    mw.Show();
    

    Separar los dos en proyectos separados también podría funcionar, pero no es necesario en este caso.

Comments are closed.