/ / Comment savoir quand une boîte de message a été affichée pour un formulaire? - c #, formes

Comment savoir quand une boîte de message a été affichée pour un formulaire? - c #, formes

Dans mon application, j'ai une tâche qui s'exécute sur un thread en arrière-plan. J'ai besoin d'une notification dans le thread d'arrière-plan lorsqu'un message ou une boîte de dialogue modale s'affiche dans le thread d'interface utilisateur.

Bien que je puisse le faire manuellement en appelant une fonction avant d’afficher la MessageBox, ce sera bien si je n’ai pas à le faire.

Pour exemple:

backgroundThread.MessageShown(); // I do not want to call this explicitly every time!
MessageBox.Show("Task halted!");

Je devine qu'il pourrait y avoir un message sur lequel on pourrait accrocher. Même dans le fil principal de l'interface graphique, y a-t-il un message / événement qui est déclenché juste avant qu'un dialogue modal ne s'affiche?

Ok, voici l'exigence. Certaines tâches sont effectuées sur le thread d'interface utilisateur et je dois afficher les progrès dans une boîte de dialogue distincte, qui est affichée sur un thread de travail. Je comprends que ce devrait être les tâches qui doivent être effectuées sur le thread de travail, mais le scénario actuel ne peut pas être modifié pour le moment.

Tout fonctionne bien, sauf unproblème - si une boîte de message est affichée dans le fil de l'interface utilisateur, elle est masquée sous la boîte de dialogue de progression. Ainsi, l'utilisateur ne sait jamais que l'interface utilisateur attend une entrée. J'ai besoin d'un moyen d'être informé qu'une boîte de dialogue modale a été affichée et que je dois masquer la boîte de dialogue de progression.

Pour le moment, je dois le cacher explicitement juste avant chaque appel à MessageBox.

J'espère que ça explique.

Réponses:

5 pour la réponse № 1

Mettre en place un Crochet CBT. Ensuite, vous recevrez une notification de toutes les fenêtres créées, activées, désactivées et détruites. Utilisez ensuite GetWindowClass pour vérifier si le hWnd créé / activé est en fait une MessageBox.


2 pour la réponse № 2

créer votre propre boîte de message qui déclenche un événement lorsque vous appelez Show?


0 pour la réponse № 3

Si le parent de votre MessageBox est TopMost, votre MessageBox sera TopMost. Donc, quelque chose comme ...

MessageBox.Show( new Form() { TopMost = true }, "Message and so forth ..." );

Cela pourrait aussi fonctionner pour vous ...

DllImport("user32.dll")]
public static extern int MessageBox(int hWnd, String text, String caption, uint type);

Et passe MB_TOPMOST comme le type.