He sido desarrollador de .NET durante varios años y esta sigue siendo una de esas cosas que no sé cómo hacer correctamente. Es fácil ocultar una ventana de la barra de tareas a través de una propiedad tanto en Windows Forms como en WPF, pero por lo que puedo decir, esto no garantiza (ni necesariamente afecta) que se oculte del cuadro de diálogo Alt+ ↹Tab. He visto aparecer ventanas invisibles en Alt+ ↹Tab, y me pregunto cuál es la mejor manera de garantizar que una ventana nunca aparecerá (visible o no) en el cuadro de diálogo Alt+ ↹Tab.
Actualización: consulte mi solución publicada a continuación. No puedo marcar mis propias respuestas como la solución, pero hasta ahora es la única que funciona.
Actualización 2: Ahora hay una solución adecuada de Franci Penov que se ve bastante bien, pero no la he probado yo mismo. Incluye algo de Win32, pero evita la creación poco convincente de ventanas fuera de la pantalla.
Respuestas:
Actualizar:
Según @donovan, en la actualidad WPF admite esto de forma nativa, a través de la configuración
ShowInTaskbar="False"
yVisibility="Hidden"
en el XAML. (No he probado esto todavía, pero sin embargo decidí aumentar la visibilidad de los comentarios)Respuesta original:
Hay dos formas de ocultar una ventana del conmutador de tareas en la API de Win32:
WS_EX_TOOLWINDOW
estilo de ventana extendida, ese es el enfoque correcto.Desafortunadamente, WPF no admite un control tan flexible sobre el estilo de la ventana como Win32, por lo que una ventana
WindowStyle=ToolWindow
termina con los estilosWS_CAPTION
y predeterminadosWS_SYSMENU
, lo que hace que tenga un título y un botón de cierre. Por otro lado, puede eliminar estos dos estilos configurandoWindowStyle=None
, sin embargo, eso no establecerá elWS_EX_TOOLWINDOW
estilo extendido y la ventana no se ocultará del selector de tareas.Para tener una ventana de WPF
WindowStyle=None
que también esté oculta en el selector de tareas, se puede de dos maneras:WS_EX_TOOLWINDOW
estilo extendido.Personalmente prefiero el segundo enfoque. Por otra parte, hago algunas cosas avanzadas como extender el cristal en el área del cliente y habilitar el dibujo de WPF en el título de todos modos, por lo que un poco de interoperabilidad no es un gran problema.
Aquí está el código de muestra para el enfoque de la solución de interoperabilidad de Win32. Primero, la parte XAML:
Nada demasiado sofisticado aquí, solo declaramos una ventana con
WindowStyle=None
yShowInTaskbar=False
. También agregamos un controlador al evento Loaded donde modificaremos el estilo de la ventana extendida. No podemos hacer ese trabajo en el constructor, ya que todavía no hay un identificador de ventana en ese punto. El controlador de eventos en sí es muy simple:Y las declaraciones de interoperabilidad de Win32. He eliminado todos los estilos innecesarios de las enumeraciones, solo para mantener pequeño el código de muestra aquí. Además, desafortunadamente, el
SetWindowLongPtr
punto de entrada no se encuentra en user32.dll en Windows XP, de ahí el truco de enrutar la llamada a través deSetWindowLong
.fuente
Dentro de su clase de formulario, agregue esto:
Es tan fácil como eso; funciona de maravilla!
fuente
Encontré una solución, pero no es bonita. Hasta ahora, esto es lo único que he probado que realmente funciona:
Lo encontré aquí .
Una solución reutilizable más general estaría bien. Supongo que podría crear una sola ventana 'w' y reutilizarla para todas las ventanas de su aplicación que deben ocultarse del signo Alt+ ↹Tab.
Actualización: Ok, entonces lo que hice fue mover el código anterior, menos el
this.Owner = w
bit (y moverw.Hide()
inmediatamente despuésw.Show()
, que funciona bien) en el constructor de mi aplicación, creando una estática públicaWindow
llamadaOwnerWindow
. Siempre que quiero que una ventana muestre este comportamiento, simplemente configurothis.Owner = App.OwnerWindow
. Funciona muy bien y solo implica la creación de una ventana adicional (e invisible). Incluso puede establecerthis.Owner = null
si desea que la ventana vuelva a aparecer en el cuadro de diálogo Alt+ ↹Tab.Gracias a Ivan Onuchin en los foros de MSDN por la solución.
Actualización 2: Usted también debe establecer
ShowInTaskBar=false
enw
para evitar que parpadear brevemente en la barra de tareas cuando se muestra.fuente
-100000
Probablemente sería mejor usar un desplazamiento como .¿Por qué tan complejo? Prueba esto:
Idea tomada de aquí: http://www.csharp411.com/hide-form-from-alttab/
fuente
Esto es lo que hace el truco, independientemente del estilo de la ventana de la que intentas esconderte Alt+ ↹Tab.
Coloque lo siguiente en el constructor de su formulario:
Esencialmente, convierte su formulario en un elemento secundario de una ventana invisible que tiene el estilo correcto y la configuración ShowInTaskbar para mantenerse fuera de la lista Alt-Tab. También debe establecer la propiedad ShowInTaskbar de su propio formulario en falso. Lo mejor de todo es que simplemente no importa qué estilo tenga su formulario principal, y todos los ajustes para lograr la ocultación son solo unas pocas líneas en el código del constructor.
fuente
¿Por qué probar tantos códigos? Simplemente configure la
FormBorderStyle
propiedad enFixedToolWindow
. Espero eso ayude.fuente
verlo: (de http://bytes.com/topic/c-sharp/answers/442047-hide-alt-tab-list#post1683880 )
fuente
En XAML, establezca ShowInTaskbar = "False":
Editar: Eso todavía lo muestra en Alt + Tab, supongo, pero no en la barra de tareas.
fuente
Intenté configurar la visibilidad del formulario principal en falso cada vez que se cambia automáticamente a verdadero:
Funciona perfectamente :)
fuente
si desea que el formulario no tenga bordes, debe agregar las siguientes declaraciones al constructor del formulario:
Y debe agregar el siguiente método a su clase de formulario derivada:
más detalles
fuente
No muestre un formulario. Usa la invisibilidad.
Más aquí: http://code.msdn.microsoft.com/TheNotifyIconExample
fuente
Propiedades de Form1:
FormBorderStyle: Sizable
WindowState: Minimizado
ShowInTaskbar: False
fuente
Personalmente, hasta donde yo sé, esto no es posible sin engancharlo a las ventanas de alguna manera, ni siquiera estoy seguro de cómo se haría o si es posible.
Dependiendo de sus necesidades, desarrollar el contexto de su aplicación como una aplicación NotifyIcon (bandeja del sistema) permitirá que se ejecute sin mostrarse en ALT + TAB. SIN EMBARGO, si abre un formulario, ese formulario seguirá la funcionalidad estándar.
Puedo indagar en el artículo de mi blog sobre la creación de una aplicación que SÓLO es un NotifyIcon por defecto si lo desea.
fuente