Question

Existe-t-il un moyen de garder une fenêtre inactive, même si elle contient le focus? J'ai deux formes (A et B). Une fois que l'utilisateur a interagi avec A, je rétablis le focus sur B. Le résultat du transfert de focus (l'utilisateur clique sur A puis sur B) est que le formulaire A clignote de actif à inactif. Cela semble moche (surtout sur Vista où A obtient momentanément une plus grande ombre). Comment puis-je rendre A rester inactif pour que ce clignotement ne se produise pas?

Était-ce utile?

La solution

Enfin, j'ai trouvé la réponse!

AVERTISSEMENT: N'ABUSEZ PAS la technique de cette réponse. Cela gênerait vos utilisateurs et nuirait à l'expérience informatique en général. La technique décrite ci-dessous peut être très utile dans certaines circonstances (par exemple, mettre en œuvre un comportement de type IntelliSense), mais s'il vous plaît soyez judicieux dans votre utilisation de celui-ci.

Le message WM_NCACTIVATE est envoyé à un correspondant. fenêtre pour changer l’état de sa zone non-client (ie bordure et barre de titre) en inactif ou actif. Le paramètre wParam du message indique si l'état sera inactif ou actif. Si wParam est vrai (valeur 1), la fenêtre sera active. Si le paramètre wParam est false (valeur 0), la fenêtre sera inactive. Pour forcer une fenêtre à rester inactive ou active, remplacez le paramètre wParam en lui attribuant la valeur correspondante (0 ou 1) et vous serez tous définis!

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

Autres conseils

Vous parlez de changer le comportement par défaut d'un modèle d'interface graphique. Je ne conseillerais pas de le faire. Si l'utilisateur fait quelque chose sur A, puis revenir à B ne devrait pas A disparaître? Pourquoi est-ce qu'il "clignote"? Ce devrait être un simple commutateur lorsque le changement de focus se produit.

Vous ne pouvez pas dire d'après ce que vous décrivez que le focus change comme:

A- > B
B- > A- > utilisateur click- > B
B- > A

?

Vous n'êtes pas sûr que cela aide, mais Winforms prend en charge le concept de formulaires détenus. Par exemple, même si les barres d'outils flottantes résident en dehors d'une fenêtre de niveau supérieur, elles restent actives même lorsque la fenêtre de niveau supérieur est active (et inversement). De même, vous souhaitez que l'utilisateur puisse interagir avec votre formulaire A sans désactiver le formulaire B.

Pour cela, vous devez appeler b.AddOwnedForm (a) juste avant d'afficher a .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top