Bonjour,
j'ai besoin de créer une classe dans une Dll qui peut ouvrir une Windows Form. Cette classe peut aussi bien être appelée d'une application en mode console que d'une Windows Form. 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:
| 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); |
| } |
| } |
3/ dans ce cas là, si la Form est ouverte avec CalledForm.ThreadedShow()
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 GetConsoleModemais ce n'est pas plus fiable non plus.