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:
- Lleve esa aplicación a la parte superior (frente a todas las demás ventanas)
- Conviértalo en la ventana activa
¿Qué llamadas a funciones de Windows se necesitan?
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);
}
}