Estoy usando un formulario para mostrar notificaciones (aparece en la parte inferior derecha de la pantalla), pero cuando muestro este formulario roba el foco del formulario principal. ¿Hay alguna forma de mostrar este formulario de "notificación" sin robar foco?
140
form1.Enabled = false
para evitar que los controles internos se robaran el focoWS_EX_NOACTIVATE
yWS_EX_TOOLWINDOW
son0x08000000
y0x00000080
respectivamente.Robados de PInvoke.net 's ShowWindow método:
(Alex Lyman respondió esto, solo lo estoy expandiendo pegando directamente el código. Alguien con derechos de edición puede copiarlo allí y eliminarlo por lo que me importa;))
fuente
Si está dispuesto a usar Win32 P / Invoke , puede usar el método ShowWindow (el primer ejemplo de código hace exactamente lo que desea).
fuente
Esto es lo que funcionó para mí. Proporciona TopMost pero sin robo de foco.
Recuerde omitir la configuración de TopMost en el diseñador de Visual Studio o en otro lugar.
Esto es robado, err, prestado, desde aquí (haga clic en Soluciones):
https://connect.microsoft.com/VisualStudio/feedback/details/401311/showwithoutactivation-is-not-supported-with-topmost
fuente
Hacer esto parece un truco, pero parece funcionar:
Editar: Tenga en cuenta que esto simplemente genera un formulario ya creado sin robar foco.
fuente
El código de muestra de pinvoke.net en las respuestas de Alex Lyman / TheSoftwareJedi hará que la ventana sea una ventana "superior", lo que significa que no puede colocarla detrás de las ventanas normales después de que aparezca. Dada la descripción de Matias de para qué quiere usar esto, eso podría ser lo que quiere. Pero si desea que el usuario pueda colocar su ventana detrás de otras ventanas después de que la haya desplegado, simplemente use HWND_TOP (0) en lugar de HWND_TOPMOST (-1) en la muestra.
fuente
En WPF puedes resolverlo así:
En la ventana pon estos atributos:
El último atributo es el que necesita ShowActivated = "False".
fuente
Tengo algo similar, y simplemente muestro el formulario de notificación y luego hago
para volver a centrarnos en el formulario principal.
fuente
Cree e inicie el Formulario de notificación en un hilo separado y restablezca el enfoque a su formulario principal después de que se abra el Formulario. Haga que el formulario de notificación proporcione un evento OnFormOpened que se desencadena desde el
Form.Shown
evento. Algo como esto:También puede mantener un identificador de su objeto NotifcationForm para que el formulario principal (
frm.Close()
) pueda cerrarlo mediante programación .Faltan algunos detalles, pero espero que esto te lleve en la dirección correcta.
fuente
Es posible que desee considerar qué tipo de notificación le gustaría mostrar.
Si es absolutamente crítico informar al usuario sobre algún evento, usar Messagebox.Show sería la forma recomendada, debido a su naturaleza, para bloquear cualquier otro evento en la ventana principal, hasta que el usuario lo confirme. Sin embargo, tenga en cuenta la ceguera emergente.
Si es menos que crítico, es posible que desee utilizar una forma alternativa de mostrar notificaciones, como una barra de herramientas en la parte inferior de la ventana. Escribió que muestra las notificaciones en la esquina inferior derecha de la pantalla; la forma estándar de hacerlo sería utilizando una punta de globo con la combinación de un icono de la bandeja del sistema .
fuente
Esto funciona bien
Ver: OpenIcon - MSDN y SetForegroundWindow - MSDN
fuente
También puede manejarlo solo por lógica, aunque tengo que admitir que las sugerencias anteriores donde termina con un método BringToFront sin realmente robar el foco es la más elegante.
De todos modos, me encontré con esto y lo resolví usando una propiedad DateTime para no permitir más llamadas BringToFront si las llamadas ya se hicieron recientemente.
Suponga una clase principal, 'Core', que maneja, por ejemplo, tres formas, 'Form1, 2 y 3'. Cada formulario necesita una propiedad DateTime y un evento Activate que llame a Core para traer ventanas al frente:
Y luego crea el trabajo en Core Class:
En una nota al margen, si desea restaurar una ventana minimizada a su estado original (no maximizada), use:
Una vez más, sé que esto es solo una solución de parche en ausencia de un BringToFrontWithoutFocus. Es una sugerencia si desea evitar el archivo DLL.
fuente
No sé si esto se considera como publicación necro, pero esto es lo que hice, ya que no pude hacerlo funcionar con los métodos "ShowWindow" y "SetWindowPos" de user32. Y no, anular "ShowWithoutActivation" no funciona en este caso ya que la nueva ventana debe estar siempre arriba. De todos modos, creé un método auxiliar que toma una forma como parámetro; cuando se le llama, muestra el formulario, lo lleva al frente y lo convierte en TopMost sin robar el foco de la ventana actual (aparentemente lo hace, pero el usuario no lo notará).
fuente
Sé que puede sonar estúpido, pero esto funcionó:
fuente
Necesitaba hacer esto con mi ventana TopMost. Implementé el método PInvoke anterior, pero descubrí que mi evento Load no se llamaba como Talha arriba. Finalmente lo logré. Quizás esto ayude a alguien. Aquí está mi solución:
fuente
Cuando crea un nuevo formulario usando
roba el foco porque su código no puede continuar ejecutándose en el formulario principal hasta que se cierre este formulario.
La excepción es mediante el uso de subprocesos para crear un nuevo formulario y luego Form.Show (). Sin embargo, asegúrese de que el hilo sea visible globalmente, porque si lo declara dentro de una función, tan pronto como su función salga, su hilo terminará y el formulario desaparecerá.
fuente
Figurado a cabo:
window.WindowState = WindowState.Minimized;
.fuente