Bonjour,
j'ai besoin de créer une classe dans une Dll qui peut ouvrir une Windows Form en mode non-modal. Cette classe peut aussi bien être appelée d'une application en mode console (CUI) que d'une Windows Form (GUI). Pour les besoins de l'exemple, nous appellerons cette classe 'CalledForm'.
Pour l'instant, voici les options autour desquelles j'ai prospecté:
1/ la Form est ouverte avec Application.Run(CalledForm):
a. mode Console: il faut que CalledForm soit fermée pour que ce qui est envoyé à la console soit lu.
b. mode Form: plein de problèmes, soit des exceptions, soit CalledForm s'affiche à la place de l'autre Form, etc.
2/ la Form est ouvert avec CalledForm.Show()
a. mode Console: CalledForm s'ouvre, mais ne se dessine pas, et le curseur se met en sablier (la Form se bloque)
b. mode Form: tout va bien. Ca semble bien la méthode idoine.
après investigation sur le net, j'ai mis en place une solution tierce, qui consiste à 'threader' l'appel à Application.Run, dont voici les bases:
3/ dans ce cas là, si la Form est ouverte avec CalledForm.ThreadedShow()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public partial class CalledForm: Form { private Thread m_localThread = new Thread(Run); private static void Run(Object frm) { Application.EnableVisualStyles(); Application.Run((Form)frm); } public void ThreadedShow() { if (!m_localThread.IsAlive) m_localThread.Start(this); } }
a. mode Console. Tout va bien. C'est clairement la méthode recommandée.
b. mode Form: ça marche, mais ce n'est pas optimale (CalledForm est clairement plus lente) et elle n'est pas fermée quand on quitte l'appli principale.
Ma question est donc, comment puis-je, par programmation, savoir dans quel mode je suis, pour pouvoir appeler la bonne méthode (Show() ouThreadedShow()) ?
A savoir:
j'ai essayé Application.OpenForms, qui s'avère peu fiable, on peut se trouver dans des cas ou ça renvoie 0 alors que des formes sont en construction.
j'ai égalemet essayé GetStdHandle et GetConsoleMode mais ce n'est pas fiable non plus.
Partager