2016-12-28 2 views
0

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

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

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

Далее я попробовал следующий код, однако кажется, что отключенный объект Word Application в 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 Document, которые помогают мне?

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

Например,

  • пункт Convert экрана к оконному точке окна, держащего текст (текст письма)
  • получить текст в этой точке.

Что является лучшим WinAPI для получения текста в точке в окне. Это SendMessage с EM_GETSEL?

ответ

0

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

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

First Thought - Outlook и Word Object Model only. Как вы можете видеть в этом вопросе, моя первая мысль заключалась в том, чтобы использовать тот же объект Window, который вы можете использовать в 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 Inspector. Поля не помогли мне. Это может быть способ сделать это, но я не работал.

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

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

Сочетание WinAPI и Word, Object Model Решение, которое я нашел, который работает с чтением панелей Explorer, а также со всеми инспекторами, чтобы использовать комбинацию WinApi и Word.

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

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

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

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