J'ai 2 formes qui sont visibles. Est-il possible de détecter si une boîte de message est visible/affichée depuis l'un des formulaires sur l'autre?Comment détecter si une boîte de message est visible?
1
A
Répondre
2
La façon la plus simple de le faire serait de faire votre propre wrapper autour MessageBox.Show
qui suit les appels dans une propriété Shared
, puis appelez exclusivement au lieu de MessageBox.Show
et MsgBox
.
2
C'est possible, mais nécessite une portion assez importante de P/Invoke. L'astuce consiste à énumérer les fenêtres appartenant au thread d'interface utilisateur et à vérifier si l'une d'entre elles est une fenêtre de dialogue Windows. Ce code fera l'affaire. Je ne peux pas garantir une précision de 100%, il peut y avoir une autre boîte de dialogue non gérée dans une application qui ressemble au modèle de boîte de message.
using System;
using System.Text;
using System.Runtime.InteropServices;
static class MessageBoxFinder {
public static bool IsPresent() {
// Enumerate windows to find the message box
EnumThreadWndProc callback = new EnumThreadWndProc(checkWindow);
return false == EnumThreadWindows(GetCurrentThreadId(), callback, IntPtr.Zero);
}
private static bool checkWindow(IntPtr hWnd, IntPtr lp) {
// Checks if <hWnd> is a dialog
StringBuilder sb = new StringBuilder(260);
GetClassName(hWnd, sb, sb.Capacity);
if (sb.ToString() != "#32770") return true;
// Got a dialog, check if the the STATIC control is present
IntPtr hText = GetDlgItem(hWnd, 0xffff);
return hText == IntPtr.Zero;
}
// P/Invoke declarations
private delegate bool EnumThreadWndProc(IntPtr hWnd, IntPtr lp);
[DllImport("user32.dll")]
private static extern bool EnumThreadWindows(int tid, EnumThreadWndProc callback, IntPtr lp);
[DllImport("kernel32.dll")]
private static extern int GetCurrentThreadId();
[DllImport("user32.dll")]
private static extern int GetClassName(IntPtr hWnd, StringBuilder buffer, int buflen);
[DllImport("user32.dll")]
private static extern IntPtr GetDlgItem(IntPtr hWnd, int item);
}
0
I figured it out, la réponse la plus simple est d'utiliser ce et à la recherche pour le titre de la boîte de message:
<System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
End Function
Questions connexes
- 1. android détecter si une boîte de dialogue est active?
- 2. Vérifier si l'objet est visible
- 3. Détection si une chaîne particulière est actuellement visible sur TextField()
- 4. Détecter si une boîte de dialogue de l'interface utilisateur jQuery est ouverte
- 5. Comment déterminer si une vue est visible dans un ListView?
- 6. Déterminer si une sous-vue est visible dans un UIScrollView
- 7. détecter si le type est une fonction
- 8. jQuery; détecter si une boîte de sélection a été modifiée ou est sélectionnée
- 9. vérifier si le groupe de formulaire est visible
- 10. boîte de message
- 11. Détecter si Tooltip est affiché?
- 12. Vérifie si un UIAlertView est visible
- 13. Comment détecter si un microphone est présent
- 14. Comment détecter si Vista UAC est activé?
- 15. comment détecter si PHPSESSID est modifié
- 16. Détecter si IIS est activé
- 17. WIX: Comment détecter si une application tierce est installée?
- 18. accès: comment détecter avec VBA si une requête est ouverte?
- 19. Comment détecter si une énumération LINQ est matérialisée?
- 20. Comment détecter si une application COM est en cours d'exécution?
- 21. Comment détecter si HPET est disponible
- 22. Comment détecter dans Safari si une application est installée
- 23. Comment puis-je détecter si Dispatcher.DisableProcessing est actif?
- 24. Est-il possible de détecter si une boîte de dialogue modale est ouverte sur la fenêtre principale?
- 25. Comment détecter si une page Web distante est disponible
- 26. Comment détecter si une application est exécutée sous KVM?
- 27. Comment implémenter une boîte de message dans une application Cocoa?
- 28. Détecter si Javascript est activé?
- 29. En C# .Net, comment détecter si une boîte de dialogue apparaît?
- 30. Détecter si ADOBE est installé
Je me demande pourquoi System.Windows.Forms.MessageBox a un constructeur privé. Ce serait beaucoup plus simple si vous pouviez simplement hériter de l'implémentation de base et changer les méthodes hide/show. –
C'est une classe 'Shared'. Ce ne serait pas possible. – SLaks
Bon point. Ça a du sens. –