Amigos,cómo mostrar formulario frente en C#
Por favor, ¿alguien sabe cómo mostrar un formulario desde una aplicación de otro modo invisible, y han que conseguir el enfoque (es decir, aparecen en la parte superior de otras ventanas)? Estoy trabajando en C# .NET 3.5.
sospecho que he tomado "totalmente errónea" ... hago noApplication.Run (nueva ElFormulario()) en lugar de eso(nueva ElFormulario()). ShowModal(). .. El formulario es básicamente un diálogo modal, con algunas casillas de verificación; un cuadro de texto, y botones Aceptar y Cancelar. El usuario marca una casilla de verificación y escribe una descripción (o lo que sea) luego presiona OK, el formulario desaparece y el proceso lee la entrada del usuario desde el Formulario, lo descarta y continúa el proceso.
Esto funciona, excepto cuando el formulario muestra que no se enfoca, sino que aparece detrás de la aplicación "host", hasta que hace clic en la barra de tareas (o lo que sea). Este es un comportamiento muy molesto, que predigo que causará muchas "llamadas de soporte", y la versión VB6 existente no tiene este problema, por lo que retrocederé en usabilidad ... y los usuarios no aceptarán eso (y ni deberían hacerlo).
Así que ... Estoy empezando a pensar que necesito volver a pensar todo el shebang ... Debo mostrar el formulario por adelantado, como una "aplicación normal" y adjuntar el resto del proceso al botón Aceptar -click evento. Debería funcionar, pero tomará un tiempo que no tengo (ya estoy a tiempo/presupuesto) ... así que primero tengo que tratar de hacer que el enfoque actual funcione ... incluso con rapidez y métodos sucios
Entonces, ¿alguien sabe cómo "forzar" un formulario .NET 3.5 (por medios justos o aves de corral) para obtener el enfoque? Estoy pensando en llamadas a la API de Windows "mágicas" (lo sé
Twilight Zone: Esto solo parece ser un problema en el trabajo, estamos usando Visual Studio 2008 en Windows XP SP3 ... I Simplemente no reproduje el problema con un SSCCE (ver a continuación) en casa en Visual C# 2008 en Vista Ulimate ... Esto funciona bien. ¿Eh? WTF?
Además, juraría que ayer en el trabajo se mostró el formulario cuando ejecuté el EXE, pero no cuando F5'ed (o Ctrl-F5'ed) directamente desde el IDE (que acabo de soportar) ... En casa, el formulario muestra bien en ambos sentidos. Totalmente confuso!
Puede o no ser relevante, pero Visual Studi o se estrelló y quemó esta mañana cuando el proyecto se estaba ejecutando en modo de depuración y editando el código "sobre la marcha" ... se quedó atascado lo que supuse era un ciclo interminable de mensajes de error. El mensaje de error era algo sobre "no puedo depurar este proyecto porque no es el proyecto actual, o algo así ... Así que lo acabo de matar con el explorador de procesos. Comenzó de nuevo bien, e incluso se ofreció a recuperar el" perdido "archivo, una oferta que acepté
using System;
using System.Windows.Forms;
namespace ShowFormOnTop {
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
Form1 frm = new Form1();
frm.ShowDialog();
}
}
}
Antecedentes:. estoy portar una aplicación de VB6 a .NET existente ... es un 'plugin' para una 'aplicación SIG cliente' llamada MapInfo El. el cliente existente "funcionó de manera invisible" y mis instrucciones son "mantener la nueva versión lo más cerca posible de la versión anterior", que funciona bastante bien (después de años de parcheo); está escrita en un lenguaje no compatible, por lo que necesitamos
Sobre mí: Soy bastante novato en C# y .NET en general, aunque tengo un certificado de limpieza de fondos, he sido programador profesional durante 10 años; Entonces, como que "sé algunas cosas".
Cualquier idea sería muy bienvenida ... y gracias a todos por tomarse el tiempo para leer hasta aquí. La consistencia no es (aparentemente) mi fuerte.
Saludos. Keith.
voy a ir a darle una nudos. Gracias por su sugerencia. Lo aprecio – corlettk
Simplemente estableciendo
this.TopMost = true
en Form_Load funciona como un amuleto. ¡Gracias, gracias, y gracias! – corlettkTuve un problema similar, y había intentado usar esto. Enfocar() y esto. Activar() en el evento Load sin éxito, pero estableciendo esto.TopMost = true en el evento Load funcionó perfectamente para mí. Gran publicación, y muchas gracias por la respuesta. +1 – Jim