检查窗口是否是MessageBox

时间:2013-02-21 09:57:55

标签: c# winapi interop

我有一个功能,我可以对出现的窗口作出反应。现在我想知道出现的窗口是否是Messagebox。如果它是一个,我想阅读它的文本。

我已经能够通过

提取Window-Title,Class-Name和Process-Id
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
internal static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

[DllImport("user32.dll")]
internal static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

但是我怎样才能找到消息框的文本?

要获得所有使用此窗口的窗口:

internal static class WindowFinder
    {
    private static readonly List<IntPtr> listWindows = new List<IntPtr>();

    private static bool IsWindowOrDialog(IntPtr hwnd, int lParam)
    {
        if (NativeMethods.IsHungAppWindow(hwnd) || !NativeMethods.IsWindowVisible(hwnd))
            return true;
        listWindows.Add(hwnd);
        return true;
    }

    internal static IEnumerable<IntPtr> GetAllWindows()
    {
        listWindows.Clear();
        NativeMethods.EnumWindows(IsWindowOrDialog, IntPtr.Zero);
        return listWindows;
    }
}

1 个答案:

答案 0 :(得分:1)

我不知道你在做什么,但你可以:

  1. FindWindow
  2. GetDlgItem并使用
  3. 提取文字
  4. GetWindowText
  5. 由于MessageBoxes的类型为static(0xFFFF),因此您应该使用GetDlgItemGetWindowText,如下所示:

    IntPtr dlgHandle = GetDlgItem(MboxHandle, 0xFFFF);
    GetWindowText(dlgHandle, yourStringBuilder, maxTextCount);