Pergunta

Existe uma maneira de manter uma janela inativa procurando, mesmo que contenha foco? I têm duas formas (A e B). Após o usuário interage com a, eu transferência de volta para o foco B. O resultado das transferências de focagem (o utilizador clicar no UM, então o foco está sendo transferido para trás para B) é que formam uma pisca de activa para inactiva. Este parece feio (especialmente no Vista, onde um fica momentaneamente uma sombra maior). Como posso fazer uma estadia inativa procurando assim que esta piscando não vai acontecer?

Foi útil?

Solução

Por fim, encontrei a resposta!

AVISO:. NÃO abusar técnica deste resposta Se o fizer, irá confundir os usuários e será prejudicial para a experiência de computação em geral. A técnica descrita abaixo pode ser muito útil em determinadas circunstâncias (por exemplo, a implementação IntelliSense-like comportamento), mas por favor ser criteriosa em seu uso do mesmo.

A mensagem WM_NCACTIVATE é enviado para um janela para alterar o estado da sua superfície não-cliente (isto é, fronteira e barra de título) para inactiva ou activa. O wParam da mensagem indica se o estado vai ficar inativo ou ativo. Se o wParam é verdadeiro (o valor 1), a janela ficará ativo. Se o wParam é falso (um valor de 0), a janela ficará inativo. Para forçar uma janela para ficar inactivos ou ativa, substituir o wParam definindo-o como o valor correspondente (0 ou 1), e você vai estar tudo pronto!

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);
}

Outras dicas

Você está falando sobre a mudança de um comportamento padrão de um modelo gui. Eu não aconselharia a fazê-lo. Se o usuário está fazendo algo em um, em seguida, movendo-se de volta para B não deve A desaparecer? Por que é 'piscar'? Deve ser um único interruptor quando a mudança de foco acontece.

Não foi possível dizer de que você descreve é ??a mudança de foco como:

A-> B
B-> A-> user clique-> B
B-> A

?

Não sei se isso ajuda, mas WinForms suporta o conceito de formas de propriedade. Por exemplo, apesar de barras flutuantes vive fora de uma janela de nível superior, eles permanecem activas mesmo quando a janela de nível superior é activo (e vice-versa). Da mesma forma, você quer que o usuário seja capaz de interagir com o formulário A, sem desativar forma B.

Para conseguir isso, parece que você precisa b.AddOwnedForm(a) chamada antes de você mostrar a.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top