J'ai 2 formulaires qui sont visibles. Est-il possible de détecter si une boîte de message est visible/affichée sur l'un des formulaires sur l'autre ?
Réponses
Trop de publicités?C'est possible, mais cela nécessite une utilisation assez importante de P/Invoke. L'astuce consiste à énumérer les fenêtres appartenant au thread de l'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 fenêtre 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);
}
J'ai trouvé la solution, la plus simple est d'utiliser ceci et de chercher 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