c# - net - Traer otra ventana de procesos al primer plano cuando tiene ShowInTaskbar=false
formulario maximizado c# (3)
Solo queremos que se ejecute una instancia de nuestra aplicación en cualquier momento. Por lo tanto, al iniciar, busca si la aplicación se está ejecutando y, si lo está, llama a SetForegroundWindow en la ventana principal.
Todo esto está bien y bien ... en su mayor parte ...
Cuando nuestra aplicación se inicie, mostrará una pantalla de bienvenida y un formulario de inicio de sesión. Ambas formas tienen ShowInTaskBar = false .
Debido a esto, si intenta iniciar otra copia de la aplicación cuando se muestra el formulario de inicio de sesión, ¡ese formulario de inicio de sesión no se pone al frente !
Especialmente dado que el usuario tampoco puede ver nada en la barra de tareas, lo único que se da cuenta es que la aplicación es dudosa y no puede comenzar. No hay indicación de que haya otra instancia ejecutándose.
¿Hay alguna forma de evitar este problema?
Creo que esta es la mejor solución porque se restaura desde un estado minimizado:
public static class WindowHelper
{
public static void BringProcessToFront(Process process)
{
IntPtr handle = process.MainWindowHandle;
if (IsIconic(handle))
{
ShowWindow(handle, SW_RESTORE);
}
SetForegroundWindow(handle);
}
const int SW_RESTORE = 9;
[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr handle);
[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern bool ShowWindow(IntPtr handle, int nCmdShow);
[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern bool IsIconic(IntPtr handle);
}
Llamada simple:
WindowHelper.BringProcessToFront(process);
Bueno, el código está aquí. Incluso si ShowInTaskBar
es false
, deberías poder llevarlo al frente.
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
public static void bringToFront(string title) {
// Get a handle to the Calculator application.
IntPtr handle = FindWindow(null, title);
// Verify that Calculator is a running process.
if (handle == IntPtr.Zero) {
return;
}
// Make Calculator the foreground application
SetForegroundWindow(handle);
}
Nota: debe encontrar FindWindow
utilizando la clase del formulario y no por su nombre, ya que los formularios de la pantalla de presentación a veces no tienen títulos ni incluso la caja de control. Usa Spy ++ para cavar más profundo.
Use FindWindow
en splash. Creo que esto es lo que quieres hacer: llevar la pantalla de inicio al frente mientras cargas el formulario principal.
FindWindow(null, title);
Encontrará la primera ventana que coincida con la consulta. Esto puede conducir a un comportamiento inesperado si otra ventana usa el mismo título.
Aunque las posibilidades de que esto suceda pueden parecer raras o imposibles (aplicación de instancia única) esto puede ocurrir fácilmente. El explorador de Windows, por ejemplo, utiliza el nombre del directorio seleccionado como título de la ventana (aunque invisible). Ahora bien, si el título de la ventana es un término común o coincide con el nombre del directorio de la aplicación, esto puede ser un problema.