2010-08-15 19 views
2

L'icône de notification de mon application affiche et masque la fenêtre principale de l'application en conséquence. Cependant, quand une boîte de dialogue modale est ouverte (cela peut être la boîte de dialogue À propos ou Paramètres, pour en nommer quelques-uns) je veux que la boîte de dialogue modale prenne le focus au lieu d'afficher/masquer la fenêtre principale de l'application.Comment faire pour mettre au point la boîte de dialogue modale en cliquant sur l'icône notifier en C#?

Les boîtes de dialogue modales sont ouvertes avec form.ShowDialog(this). Disons que j'ouvre la fenêtre À propos de ce code et ensuite, sans le fermer, je passe à une application différente. Quand je reviens, si je clique sur l'icône de notification, je veux que mon application obtienne le focus. Mieux encore, je veux que la boîte de dialogue modale obtienne le focus car elle est modale, je ne peux pas utiliser le formulaire parent de toute façon.

Je garde une trace avec une variable simple bool si n'importe quel formulaire (About, Settings, etc) est ouvert et quand je clique sur l'icône de notification je vérifie pour cette variable. Si c'est vrai, je fais quelque chose comme mainForm.Activate(). Ceci amène réellement la forme principale et le dialogue modal à l'avant, le seul problème est qu'il ne focalise pas le dialogue modal.

Comment puis-je résoudre ce problème sans suivre la boîte de dialogue modale ouverte et appeler le .Activate()? Cause qui serait une douleur ...

Répondre

1

Comme je l'ai dit dans les commentaires, ma solution a fini par utiliser l'API Windows.

Fondamentalement, je garde la trace de toute ouverte boîte de dialogue modale avec une variable bool. Lorsque l'icône de notification est cliquée, si la variable est fausse, elle continue, si elle est vraie, elle appelle la méthode ci-dessous et arrête l'exécution du code à ce moment (dans l'événement click de l'icône de notification).

internal static void BringModalDialogToFront() { 
    mainForm.Activate(); 
    SetForegroundWindow(GetWindow(mainForm.Handle, GW_ENABLEDPOPUP)); 
} 

Ceci résout facilement mon problème.

1

Obtient-on un événement Activate() dans votre boîte de dialogue modale lorsque la fenêtre principale est activée? Si oui, appelez SetFocus à la modale là.

Sinon, lorsque vous obtenez l'événement Activate dans votre fenêtre principale, vérifiez si cette boîte de dialogue (ou toute autre) est ouverte et appelez Activate ou SetFocus si nécessaire. IOW, puisque vous obtenez l'événement Activate dans la fenêtre principale, propagez-le dans la boîte de dialogue modale avec un appel de fonction.

IMO, en essayant de faire tout cela fonctionner sans intervention directe va être plus d'une douleur que de faire le travail directement.

HTH

+0

Le problème est que certaines de ces boîtes de dialogue modales ne sont pas exactement des formulaires en tant que la boîte de dialogue À propos/Paramètres. Quelques-unes d'entre elles sont des boîtes de dialogue de tâches d'une bibliothèque que j'utilise, qui, je crois utilise la nouvelle API Task Dialogs introduite dans Vista. Ceux-ci n'ont pas d'événement Activate. –

+1

Les dialogues de tâches ont-ils une fonction publique SetFocus()? Si non, pourriez-vous mettre l'accent sur un contrôle, un bouton, une zone de texte, un type de contrôle qui prend le focus dans la boîte de dialogue? Je pense que vous pouvez obtenir un contrôle par nombre ordinal; le «premier contrôle», pour ainsi dire, ce sera donc une solution générique. Autrement dit, pas lié à un dialogue particulier. – JustBoo

+0

Malheureusement, ni la boîte de dialogue de la tâche ni aucun contrôle ne se concentre :(Mais je pense que j'ai corrigé mon problème en recourant à l'API Windows, plus précisément en utilisant 'SetForegroundWindow()' et 'GetWindow()'. –