2 votes

Comment détecter si une boîte de message est visible ?

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 ?

4voto

Hans Passant Points 475940

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);
}

2voto

SLaks Points 391154

La façon la plus simple de procéder est de créer sa propre enveloppe autour de MessageBox.Show qui suit les appels dans un Shared et l'appeler exclusivement au lieu de MessageBox.Show y MsgBox .

2voto

DaRkMuCk Points 48

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X