Pregunta

¿Hay una manera de mantener una ventana inactiva, incluso si contiene el foco? Tengo dos formas (A y B). Después de que el usuario interactúa con A, transfiero el foco a B. El resultado de las transferencias del foco (el usuario que hace clic en la A, luego el foco se transfiere nuevamente a B) es que la forma A parpadea de activo a inactivo. Esto se ve feo (especialmente en Vista, donde A obtiene momentáneamente una sombra más grande). ¿Cómo puedo hacer que A permanezca inactivo buscando que este parpadeo no ocurra?

¿Fue útil?

Solución

¡Por fin, encontré la respuesta!

ADVERTENCIA: NO abuse de la técnica de esta respuesta. Si lo hace, confundirá a sus usuarios y será perjudicial para la experiencia informática en general. La técnica descrita a continuación puede ser muy útil bajo ciertas circunstancias (por ejemplo, implementando un comportamiento similar a IntelliSense), pero por favor sea sensato al usarlo.

El mensaje WM_NCACTIVATE se envía a un ventana para cambiar el estado de su área no cliente (es decir, borde y barra de título) a inactivo o activo. El wParam del mensaje indica si el estado estará inactivo o activo. Si el wParam es verdadero (un valor de 1), la ventana se verá activa. Si el wParam es falso (un valor de 0), la ventana se verá inactiva. Para forzar que una ventana permanezca inactiva o activa, anule el wParam configurándolo en el valor correspondiente (0 o 1), ¡y estará todo listo!

private const int WM_NCACTIVATE = 0x0086;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_NCACTIVATE)
    {
        // Use this to make it always look inactive:
        m.WParam = (IntPtr)0;

        // Alternately, use this to make it always look active:
        m.WParam = (IntPtr)1;
    }

    base.WndProc(ref m);
}

Otros consejos

Está hablando de cambiar el comportamiento predeterminado de un modelo de GUI. Yo no aconsejaría hacerlo. Si el usuario está haciendo algo en A, entonces volver a B no debería desaparecer A? ¿Por qué está 'parpadeando'? Debe ser un solo interruptor cuando ocurre el cambio de enfoque.

No se puede decir por lo que describe el cambio de enfoque, como:

A- > B
B- > A- > usuario clic- > B
B- > A

?

No estoy seguro de si esto ayuda, pero Winforms admite el concepto de formularios propios. Por ejemplo, aunque las barras de herramientas flotantes viven fuera de una ventana de nivel superior, permanecen activas incluso cuando la ventana de nivel superior está activa (y viceversa). Del mismo modo, desea que el usuario pueda interactuar con su formulario A, sin desactivar el formulario B.

Para lograr esto, parece que necesitas llamar a b.AddOwnedForm (a) justo antes de mostrar a .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top