Obtendo o texto de uma caixa de diálogo que não usa um controle de rótulo?

Esta é uma continuação da minha pergunta anteriorComo suprimir uma caixa de diálogo um servidor Inproc COM exibe.

Fundo:

Uma recapitulação da minha situação: Eu tenho um servidor COM Inproc escrito em Delphi de um terceiro. Uma das funções que eu chamo exibirá uma caixa de diálogo de mensagem de erro se ele capturar um tipo específico de erro. O problema é que estou tentando processar dados em massa, e a fonte de dados que estou usando está fazendo com que a caixa de diálogo de erro seja exibida muito (graças à resposta da minha pergunta anterior, agora ela fecha automaticamente e eu consegui executá-la conclusão, teria mostrado a caixa de diálogo e exigido alguém para pressionar OK 9923 vezes). O processo bloqueia até que a caixa de mensagem seja fechada.

Questão:

Eu gostaria de ter um registro melhor do que o diálogo de erro dizia. No entanto, qualquer tentativa de obter o texto do corpo da caixa de diálogo falhou.

//Snip

private void StartWindowListener()
{
    //Queue the watcher on the message pump if we are not watching.
    if (_watcherRunning == false)
    {
        _watcherRunning = true;
        _dummyForm.BeginInvoke(new Action(() =>
        {
            _watcherRunning = false;

            //If we are not inside the com object don't enumerate.
            if (_insideCom == false) return;

            // Enumerate windows to find dialogs
            EnumThreadWndProc callback = new EnumThreadWndProc(CheckWindow);
            EnumThreadWindows(GetCurrentThreadId(), callback, IntPtr.Zero);
            GC.KeepAlive(callback);
        }));
    }
}

private bool CheckWindow(IntPtr hWnd, IntPtr lp)
{
    // Checks if hWnd is the expected dialog
    StringBuilder sb = new StringBuilder(260);
    GetClassName(hWnd, sb, sb.Capacity);
    if (sb.ToString() == "TMessageForm")
    {
        //This returns the dialog box's title
        GetWindowText(hWnd, sb, sb.Capacity);

        //This returns IntPtr.Zero
        var hDialogText = GetDlgItem(hWnd, 0xFFFF);
        if (hDialogText != IntPtr.Zero)
            GetWindowText(hDialogText, sb, sb.Capacity);

        //This returns a empty string
        GetDlgItemText(hWnd, 0xFFFF, sb, sb.Capacity);


        //Only sees the OK button.
        IntPtr hCtl = IntPtr.Zero;
        HashSet<IntPtr> seen = new HashSet<IntPtr>();
        while ((hCtl = GetNextDlgGroupItem(hWnd, hCtl, false)) != IntPtr.Zero)
        {
            //When we see the same control twice, break out of the loop.
            if (seen.Add(hCtl) == false)
                break;

            GetClassName(hCtl, sb, sb.Capacity);
            SendMessage(hCtl, WM_GETTEXT, sb.Capacity, sb)

            //Close the dialog by sending WM_CLOSE to the window
            SendMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
        }

         //Snip...
    }
    return true;
}

//Snip...

// P/Invoke declarations
const int WM_CLOSE = 0x0010;
private delegate bool EnumThreadWndProc(IntPtr hWnd, IntPtr lp);
[DllImport("user32.dll")]
private static extern bool EnumThreadWindows(int tid, EnumThreadWndProc callback, IntPtr lp);
[DllImport("user32.dll")]
private static extern int GetClassName(IntPtr hWnd, StringBuilder buffer, int buflen);
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
[DllImport("kernel32.dll")]
private static extern int GetCurrentThreadId();

Eu pensei que eu poderia ter interrompido o diálogo antes de adicionar o texto a ele (ele ainda não está totalmente pintado quando eu quebro o código acima). No entanto, colocar umApplication.DoEvents dentro de StartWindowListener antes de iniciar a enumeração permite que a caixa de diálogo seja totalmente pintada, mas eu ainda recebo os mesmos resultados que eu postei com o código acima.

Fazendo um Ctrl-C funciona corretamente na caixa de diálogo para que eu pudesse usar isso em um beliscão, mas sendo que eu tenho que repetir isso 9923 vezes eu gostaria de evitar o uso que programaticamente.

Existe algum outro método que eu possa tentar obter o texto da caixa de mensagem?

questionAnswers(1)

yourAnswerToTheQuestion