COMException не обрабатывается в MS Word

У нас есть функция, которая должна получить диапазон просматриваемого текста в текстовом документе. Тем не менее, мы получаем COMException в первых нескольких строках функции. Функция вызывается с фиксированным таймером каждые 10 секунд.

Мы имеем дело с этим в течение достаточно долгого времени и будем благодарны за любую помощь / советы, спасибо.

private void GetViewedText()
    {
        // get the rectangle shown on the screen
        IntPtr h = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;

        h = FindWindowExW(h, new IntPtr(0), "_WwF", "");        
        h = FindWindowExW(h, new IntPtr(0), "_WwB", this.Application.ActiveDocument.Name);

        h = FindWindowExW(h, new IntPtr(0), "_WwG", "Microsoft Word Document");       

        RECT tagRect = new RECT();
        GetWindowRect(h, out tagRect);
        //-------------------------------------------------------------------------------------------------------

        //get the range in the doc from the rect
        // problem with "ActiveDocument" or "ActiveWindow"
        Word.Range r1 = (Word.Range)this.Application.ActiveWindow.RangeFromPoint(tagRect.left, tagRect.top); 

        Word.Range r2 = (Word.Range)this.Application.ActiveWindow.RangeFromPoint(tagRect.right, tagRect.bottom);

        Word.Range r = this.Application.ActiveDocument.Range(r1.Start, r2.Start);
        //-------------------------------------------------------------------------------------------------------

        //for each paragraph we increase the number of times read it and change the color
        for (int p = 1; p <= r.Paragraphs.Count; p++)
        {
            Word.Range rPar = document.Range(r.Paragraphs[p].Range);
            Word.Range rParNum = document.Range(rPar.Start, rPar.Start + 1);
            Word.Range rParText = document.Range(rPar.Start + 1, rPar.End);
            try
            {
                int parNum = Int32.Parse(rParNum.Text);
                paragraphs[parNum].ReadParagrafh();
                if (paragraphs[parNum].GetCounter() == 1)
                {
                    rParText.HighlightColorIndex = Word.WdColorIndex.wdYellow;
                }
                else if (paragraphs[parNum].GetCounter() == 2)
                {
                    rParText.HighlightColorIndex = Word.WdColorIndex.wdBrightGreen;
                }
                else
                {
                    rParText.HighlightColorIndex = Word.WdColorIndex.wdGreen;
                }
            }
            catch
            {
                continue;
            }
        }
    }

2 ответа

Решение

Исправил это, пришлось удалить документ. Диапазон, поэтому новая строка:

Word.Range rPar = r.Paragraphs [p].Range;

У вас происходит сбой из-за нулевой ссылки на индекс?

for (int p = 1; p <= r.Paragraphs.Count; p++)

изменить на

for (int p = 0; p < r.Paragraphs.Count; p++)

Так много вещей на основе 0. Допустим, у вас есть 4 абзаца. Внутренне к документу, они упоминаются как

paragraph[0], paragraph[1], paragraph[2], paragraph[3]

или же

paragraph[1], paragraph[2], paragraph[3], paragraph[4]

COUNT параграфов может быть 4, но упоминается как 0-3... Вещи, возможно, работали хорошо, например: 10 параграфов, и это работало с 1-9 все действительные (так как 10 записей были бы 0-9), но затем, когда вы попробовали 10-й, такой ссылки не существует.

Отзыв от комментария...

Начиная с 1, может быть, вам следует попробовать предварительно проверить NULL диапазона?

if( r.Paragraphs[p].Range == null )
   continue;

Word.Range rPar = document.Range(r.Paragraphs[p].Range);
Другие вопросы по тегам