Как получить текст / диапазон в точке инспектора Outlook?

Я хочу знать текст в какой-то момент, например, в электронной почте Outlook.

В Excel и Word я могу получить ActiveWindow. Обе объектные модели предлагают метод RangeFromPoint, который у меня работает.

В Outlook объект Applicaion имеет ActiveWindow, но возвращает объект Explorer или Inspector.

Далее я попробовал следующий код, однако, кажется, отключенный объект приложения Word в Outlook не предлагает RangeFromPoint.

Dim ins As Outlook.Inspector = olMail.GetInspector
Dim wDoc As Word.Document = ins.WordEditor
Dim w As Word.Window = wDoc.ActiveWindow
Dim rng As Word.Range = w.RangeFromPoint(mousePosition.X, mousePosition.Y)

Я предполагаю, что объектная модель Outlook не поможет мне.

Есть ли какие-либо другие методы в объектной модели документа Word, которые помогают мне?

Если слово объектная модель не помогает, должен ли я полагаться на WinAPI?
Если я должен использовать WinAPI, какие шаги мне нужно предпринять?

Например;

  • Преобразование точки экрана в точку окна окна, содержащего текст (тело сообщения электронной почты)
  • получите текст в этот момент.

Что такое лучший WinAPI, чтобы получить текст в точке в окне. Это SendMessage с EM_GETSEL?

1 ответ

  1. Я попробовал несколько вещей здесь.

    Почему я хочу знать текст в какой-то момент.
    Я создаю пользовательские подсказки в office. Когда мышь парит над точкой (с помощью функции winapi TrackMouseEvent), я получаю из Windows точку, где находится мышь. Затем мне нужно узнать в Outlook (Explorer / Inspector), над чем находится мышь.

    Первая мысль-Outlook и Word только объектная модель.
    Как вы можете видеть в вопросе моей первой мыслью было использовать тот же объект окна, который вы можете использовать в Word и реализовать метод RangeFromPoint. Но MS решил не поддерживать это в Outlook. Так что это тупик.

    Второй вариант здесь был использовать либо или оба из них

    Selection.Information(Word.WdInformation.wdHorizontalPositionRelativeToPage)
    Selection.Information(Word.WdInformation.wdVerticalPositionRelativeToPage)
    

    и-или

    Selection.Information(Word.WdInformation.wdHorizontalPositionRelativeToTextBoundary)
    Selection.Information(Word.WdInformation.wdVerticalPositionRelativeToTextBoundary)
    

    Вертикаль относительно страницы всегда возвращала -1, даже когда текст был четко виден.
    Относительная граница текста возвращала номера, и они менялись с позициями, но я не понял, где была граница, когда в Инспекторе Outlook. Маржи мне не помогли. Это может быть способ сделать это, но я не разработал его.

    IUIAutomation или автоматизация
    У меня нет опыта с этими, однако мои попытки получить TextPattern не удалось в Outlook 2007 и Outlook 2010. Я называю эти версии, потому что я нашел здесь вопросы, сообщающие, что они были успешными с 2013. Я думаю, что MS в то время намеренно пытался скрыть тело электронной почты, чтобы остановить ummm замедлить почтовые вирусы.

    WinApi
    Текстовое тело письма находится в окне класса _WwG и содержимое окна не отображается. Вы получаете «сообщение» в виде текста. Кажется, здесь тоже MS сделала это намеренно. Таким образом, попытка получить текст на позиции не будет работать.

    Сочетание WinApi и объектной модели Word
    Решение, которое я нашел, которое работает с областями чтения проводника и со всеми инспекторами, заключается в использовании комбинации WinApi и Word.

    • Получение события наведения мыши с точкой в окне (_wwg класс для Outlook)
    • Используйте SendMessage и отправить messsage в это окно с WM_LBUTTONDOWN флаг.
    • Получите документ Word от инспектора.Метод WordEditor.
    • Текущий диапазон будет выбран там, где мышь находится в тексте.
    • Расширяйте диапазон до слова или чего угодно, и теперь у вас есть то, что находится под вашей мышью.

    Для Windows только для чтения в Outlook нет каре, видимого пользователю, но он все еще существует и может быть найден и использован.

    Я не реализовал это на элементах Outlook, которые разрабатываются (курсор используется и виден), но я полагаю, что мне придется переместить выделение в положение мыши, а затем переместить его обратно, чтобы иметь возможность реализовать его. Я могу себе представить, что это не лучшее для некоторых пользователей.

    Редактировать
    Есть одна проблема, которую я не смог решить. Отправив щелчок в окно, вы нажимаете на то, что находится в этот момент. Если там есть гиперссылка, как в случае с адресами электронной почты в mailItem, то она следует за гиперссылкой. Я не мог обойти эту проблему должным образом. Единственное, что я нашел в WinProc было то, что когда мышь находится над гиперссылкой, то Outlook показывает всплывающую подсказку и есть сообщение WM_USER + 2. Слушайте это сообщение и не нажимайте, если оно получено.