如何检测消息框是否可见?

时间:2010-02-25 19:06:45

标签: .net vb.net

我有2个可见的表格。是否可以检测消息框是否可以从另一个表单上显示/显示?

3 个答案:

答案 0 :(得分:2)

执行此操作的最简单方法是围绕MessageBox.Show跟踪Shared属性中的调用创建自己的包装器,然后专门调用它而不是MessageBox.Show和{{1} }。

答案 1 :(得分:2)

这是可能的,但需要相当大量的P / Invoke。诀窍是枚举UI线程拥有的窗口,并检查其中一个窗口是否为Windows对话框窗口。这段代码可以解决问题。我无法保证100%的准确性,应用程序中可能存在另一个类似于消息框模板的非托管对话框。

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

答案 2 :(得分:0)

我想通了,最简单的答案就是使用它并寻找消息框的标题:

<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