¿Cómo traigo una ventana de aplicación no administrada al frente y la convierto en la ventana activa para la entrada de usuario (simulada)

Estoy asumiendo que necesito usar pinvoke, pero no estoy seguro de qué llamadas a funciones se necesitan.

Escenario: se ejecutará una aplicación heredada, tendré Handle para esa aplicación.

Necesito:

  1. Lleve esa aplicación a la parte superior (frente a todas las demás ventanas)
  2. Conviértalo en la ventana activa

¿Qué llamadas a funciones de Windows se necesitan?

Respuestas:3 Respuestas 3
Tiempo:hace 11 años, 3 meses
Última modificación:hace 2 años, 2 meses

Solución

Si no tiene un identificador de la ventana, use esto antes:

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

Ahora asumiendo que tiene un identificador de la ventana de la aplicación:

[DllImport("user32.dll", SetLastError = true)]
static extern bool SetForegroundWindow(IntPtr hWnd);

Esto hará que la barra de tareas parpadee si otra ventana tiene enfoque de teclado.

Si desea forzar que la ventana llegue al frente, use ForceForegroundWindow (implementación de ejemplo).

Otras respuestas

    [DllImport("user32.dll")]
    public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow);
    [DllImport("user32.dll")]
    public static extern bool SetForegroundWindow(IntPtr WindowHandle);
    public const int SW_RESTORE = 9;

El método ShowWindowAsync se usa para mostrar la aplicación minimizada y el método SetForegroundWindow se usa para poner al frente la aplicación posterior.

puede usar estos métodos como los usé en mi aplicación para poner el skype delante de mi aplicación. En el botón haga clic en

private void FocusSkype()
    {
        Process[] objProcesses = System.Diagnostics.Process.GetProcessesByName("skype");
        if (objProcesses.Length > 0)
        {
            IntPtr hWnd = IntPtr.Zero;
            hWnd = objProcesses[0].MainWindowHandle;
            ShowWindowAsync(new HandleRef(null,hWnd), SW_RESTORE);
             SetForegroundWindow(objProcesses[0].MainWindowHandle);
        }
    }

Deja un comentario