Tengo una aplicación C # winforms que ejecuta una macro en otro programa. El otro programa continuamente abrirá ventanas y, en general, hará que las cosas se vean, a falta de una palabra mejor, loca. Quiero implementar un botón de cancelación que detendrá la ejecución del proceso, pero parece que no puedo hacer que la ventana permanezca en la parte superior. ¿Cómo hago esto en C #?
Editar: he probado TopMost = true; , pero el otro programa sigue apareciendo sus propias ventanas en la parte superior. ¿Hay alguna manera de enviar mi ventana a la parte superior cada n milisegundos?
Editar: La forma en que resolví esto fue agregando un ícono de la bandeja del sistema que cancelará el proceso al hacer doble clic en él. El icono de la bandeja del sistema no se cubre. Gracias a todos los que respondieron. Leí el artículo sobre por qué no hay una ventana 'súper en la parte superior' ... lógicamente no funciona.
Respuestas:
Form.TopMost
funcionará a menos que el otro programa esté creando las ventanas superiores.No hay forma de crear una ventana que no esté cubierta por las nuevas ventanas superiores de otro proceso. Raymond Chen explicó por qué.
fuente
Form.ActiveForm.TopMost
Estaba buscando hacer mi aplicación WinForms "Always on Top" pero configurar "TopMost" no hizo nada por mí. Sabía que era posible porque WinAmp hace esto (junto con muchas otras aplicaciones).
Lo que hice fue llamar a "user32.dll". No tuve reparos en hacerlo y funciona muy bien. De todos modos, es una opción.
Primero, importe el siguiente espacio de nombres:
Agregue algunas variables a su declaración de clase:
Agregue un prototipo para la función user32.dll:
Luego, en su código (agregué la llamada en Form_Load ()), agregue la llamada:
Espero que ayude. Referencia
fuente
Si por "volverse loco" quiere decir que cada ventana sigue robando el foco a la otra, TopMost no resolverá el problema.
En su lugar, intente:
Esto mostrará la forma 'infantil' sin que robe el foco. El formulario secundario también permanecerá encima de su padre incluso si el padre está activado o enfocado. Este código solo funciona fácilmente si ha creado una instancia del formulario secundario desde el formulario del propietario. De lo contrario, es posible que deba establecer el propietario mediante la API.
fuente
CalledForm.Owner
en sí mismo (CalledForm
) causará unSystem.ArgumentException
: 'Se ha hecho una referencia de control circular. Un control no puede ser propiedad de sí mismo ni ser padre de sí mismo.Establecer Form.TopMost
fuente
Tuve un lapso momentáneo de 5 minutos y olvidé especificar el formulario completo de esta manera:
¡Pero lo que realmente quería era ESTO!
fuente
Establezca la
.TopMost
propiedad del formulario en verdadero.Probablemente no quiera dejarlo así todo el tiempo: configúrelo cuando comience su proceso externo y vuelva a colocarlo cuando termine.
fuente
La forma en que resolví esto fue creando un ícono en la bandeja del sistema que tenía una opción de cancelación.
fuente
El siguiente código hace que la ventana siempre permanezca en la parte superior y que no tenga marcos.
fuente
¿Cuál es la otra aplicación cuya visibilidad está intentando suprimir? ¿Ha investigado otras formas de lograr el efecto deseado? Hágalo antes de someter a sus usuarios a un comportamiento deshonesto como el que está describiendo: lo que está tratando de hacer suena más bien a lo que ciertos sitios traviesos hacen con las ventanas del navegador ...
Al menos trata de adherirte a la regla de la menor sorpresa . Los usuarios esperan poder determinar el orden z de la mayoría de las aplicaciones por sí mismos. No sabes qué es lo más importante para ellos, así que si cambias algo, debes concentrarte en impulsar la otra aplicación detrás de todo en lugar de promocionar la tuya propia.
Por supuesto, esto es más complicado, ya que Windows no tiene un administrador de ventanas particularmente sofisticado. Se sugieren dos enfoques:
fuente
¿Por qué no convertir su formulario en un cuadro de diálogo?
fuente
TopMost = true
forzó mi formulario encima de todo, incluido Chrome, cuando en realidad es solo un cuadro de configuración y lo necesitaba en la parte superior del formulario principal. Felicitaciones a su persona de Internet.Aquí está el equivalente de SetForegroundWindow:
He visto gente haciendo cosas raras como:
http://blog.jorgearimany.com/2010/10/win32-setforegroundwindow-equivalent-in.html
fuente
this.Show(); this.Activate(); this.BringToFront();
pero esta respuesta nos llevó a esa solución. ¡Gracias!Sé que esto es antiguo, pero no vi esta respuesta.
En la ventana (xaml) agregue:
En el código detrás de Window_Deactivated:
Esto mantendrá su ventana en la parte superior.
fuente
Basándome en la respuesta de clamum y el comentario de Kevin Vuilleumier sobre la otra bandera responsable del comportamiento, hice este interruptor que cambia entre arriba y no arriba con solo presionar un botón.
fuente