检查窗口是否是MessageBox

Tom*_*tom 5 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);
Run Code Online (Sandbox Code Playgroud)

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

为了得到所有窗口我使用这个:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Chi*_*ata 1

我不知道你到底在尝试什么,但你可以:

  1. FindWindow
  2. GetDlgItem并使用提取文本
  3. GetWindowText

由于 MessageBox 是静态类型 (0xFFFF),因此您应该使用GetDlgItem和 ,GetWindowText如下所示:

IntPtr dlgHandle = GetDlgItem(MboxHandle, 0xFFFF);
GetWindowText(dlgHandle, yourStringBuilder, maxTextCount);
Run Code Online (Sandbox Code Playgroud)