2010-02-25 3 views

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.

+0

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. –

+0

C'est une classe 'Shared'. Ce ne serait pas possible. – SLaks

+0

Bon point. Ça a du sens. –

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