Tengo un formulario que aparece en la pantalla de un usuario y tiene TopMost=true
, pero le roba el foco. ¿Cómo puedo obtenerlo en no robar el foco cuando aparece por primera vez?¿Cómo abrir un WinForm con TopMost = true pero sin robar el foco?
Respuesta
Pega este código en tu forma:
protected override bool ShowWithoutActivation
{
get { return true; }
}
He probado el código de abajo usando un temporizador en Form1 para crear instancias y mostrar Form2 con formulario1 como propietario.
En el evento mostrado de form2, establezco el foco en el propietario, que es el formulario activo actual.
Tengo un cuadro de texto en form1 y pude escribir continuamente en el cuadro de texto sin perder el foco durante este proceso.
Mi código de temporizador en Form1:
private void timer1_Tick(object sender, EventArgs e)
{
Form2 popup = new Form2();
popup.TopMost = true;
popup.Show(this);
timer1.Enabled = false;
}
Mi código en el evento muestra de Form2:
private void Form2_Shown(object sender, EventArgs e)
{
this.Owner.Focus();
}
Usted puede hacer esto o simplemente establecer TopMost false y utilizar la anulación de ShowWithoutActivation como Hans Passant dijo.
Editar: (O use p/Invoke como se ve en el comentario adicional de Hans Passant echaba de menos mientras escribía esto)
me encontré con el mismo problema. No estoy usando C#, sino C++. Calculo que esto podría ser útil de todos modos:
Usando windows.h:
BOOL WINAPI SetWindowPos(
__in HWND hWnd,
__in_opt HWND hWndInsertAfter,
__in int X,
__in int Y,
__in int cx,
__in int cy,
__in UINT uFlags
);
Pasando el SWP_NOACTIVATE bandera para el argumento uFlags trabajado para mí.
Puede configurar:
this.TopMost = True;
en el evento de carga de esa forma.
¡Está bien conmigo!
no te olvides de desactivar el .topmost en el IDE en primer lugar - funciona como un encanto – Stavm
Puede hacerlo de esta manera:
private const int SW_SHOWNOACTIVATE = 4;
private const int HWND_TOPMOST = -1;
private const uint SWP_NOACTIVATE = 0x0010;
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetWindowPos")]
private static extern bool SetWindowPos(
int hWnd, // Window handle
int hWndInsertAfter, // Placement-order handle
int X, // Horizontal position
int Y, // Vertical position
int cx, // Width
int cy, // Height
uint uFlags); // Window positioning flags
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool ShowWindow(System.IntPtr hWnd, int nCmdShow);
public static void ShowInactiveTopmost(System.Windows.Forms.Form frm)
{
try
{
ShowWindow(frm.Handle, SW_SHOWNOACTIVATE);
SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST,
frm.Left, frm.Top, frm.Width, frm.Height,
SWP_NOACTIVATE);
}
catch (System.Exception ex)
{
// error handling
}
}
Esto es lo que funcionó para mí. Proporciona TopMost pero sin robo de foco.
protected override bool ShowWithoutActivation
{
get { return true; }
}
private const int WS_EX_TOPMOST = 0x00000008;
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= WS_EX_TOPMOST;
return createParams;
}
}
Recuerde que debe omitir la configuración superior en el diseñador de Visual Studio, o en otro lugar.
Esta es robado, se equivocan, prestado, de aquí (haga clic en Soluciones provisionales):
este enlace también está muerto –
@FactorMystic Eh, tarde pero [enlace Archive.org] (http://web.archive.org/web/ 20120422130419/http: //connect.microsoft.com/VisualStudio/feedback/details/401311/showwithoutactivation-is-not-supported-with-topmost). –
En lugar de escribir .setfocus()
en _activated
evento; escríbalo al .shown
evento del formulario.
- 1. Obtenga la atención del usuario sin robar el foco
- 2. Iniciar un proceso sin robar el foco (C#)
- 3. Win32, C++: Crear una ventana emergente sin robar el foco
- 4. Seleccionar página de pestaña en TabControl sin robar el foco
- 5. Pestaña UI girar robar foco
- 6. Cómo mostrar un cuadro de diálogo MFC sin robar el foco en la otra ventana
- 7. Abrir un formulario en C# sin foco
- 8. Cómo cerrar un WinForm con el teclado mientras que un control tiene foco
- 9. Winform sin .NET framework?
- 10. Cómo habilitar un botón WinForm a tiempo para recibir el foco tabulando
- 11. Cómo robar toques de UIScrollView?
- 12. ScrollViewer roba el foco
- 13. en el cambio sin perder el foco?
- 14. WPF - Desplazar sin foco
- 15. Error muy molesto con la propiedad TopMost en Windows Forms
- 16. ¿Cómo puede un botón obtener el foco?
- 17. Captura de teclas sin foco
- 18. ¿Abra un segundo winform asincrónicamente pero aún se comporte como un hijo al formulario principal?
- 19. html abrir una url en el nuevo objetivo y foco
- 20. Hacer NSWindow frontal pero no en foco
- 21. Desplazamiento RichEdit sin tener foco
- 22. Configuración de una ventana XAML siempre en la parte superior (pero no en la propiedad TopMost)
- 23. ¿Abrir el archivo sin (realmente) bloquearlo?
- 24. ¿Cómo establece programáticamente el foco en SelectedItem en un WPF ListBox que ya tiene foco?
- 25. ¿Cómo establecer el foco de regreso a la forma después de abrir un proceso (Bloc de notas)?
- 26. ¿Cómo abrir el teclado automáticamente en UITextField?
- 27. WPF TreeView con IsVirtualizing = "true" salta al cambiar de foco y desplazarse
- 28. Averigüe el control con el último foco
- 29. Detener JPopupMenu robando el foco
- 30. Actualice WPF DataGrid sin perder el foco de celda
+1: ¡odio las ventanas que roban el foco! –
Si es posible, apuesto a que Raymond Chen escribió al respecto: http: //blogs.msdn.com/b/oldnewthing/ –
Me sorprende que esto no sea algo simplemente integrado en WinForms ... – sooprise