Winapi 如何在Outlook检查器中获取某一点的文本/范围?

Winapi 如何在Outlook检查器中获取某一点的文本/范围?,winapi,outlook,ms-word,vsto,Winapi,Outlook,Ms Word,Vsto,我想知道Outlook电子邮件中某一点的文本 在Excel和Word中,我可以获得ActiveWindow。这两个对象模型都提供了RangeFromPoint方法,这是我正在使用的 在Outlook中,应用程序对象有一个ActiveWindow,但它返回一个Explorer或Inspector对象 此外,我尝试了以下代码,但是Outlook中禁用的Word应用程序对象似乎不提供RangeFromPoint Dim ins As Outlook.Inspector = olMail.GetInsp

我想知道Outlook电子邮件中某一点的文本

在Excel和Word中,我可以获得ActiveWindow。这两个对象模型都提供了RangeFromPoint方法,这是我正在使用的

在Outlook中,应用程序对象有一个ActiveWindow,但它返回一个Explorer或Inspector对象

此外,我尝试了以下代码,但是Outlook中禁用的Word应用程序对象似乎不提供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文档对象模型中还有其他方法可以帮助我吗

如果Word对象模型没有帮助,我必须依赖WinAPI吗? 如果我必须使用WinAPI,我需要采取哪些步骤

比如,

  • 将屏幕点转换为包含文本(电子邮件正文)的窗口的窗口点
  • 此时获取文本

获取窗口中某个点的文本的最佳WinAPI是什么。是用EM_GETSEL发送消息吗?

我在这里尝试了一些方法

为什么我想知道某一点的文本。 我正在将自定义工具提示构建到office中。当鼠标悬停在某个点上时(通过使用winapi函数TrackMouseeEvent),我从Windows接收鼠标所在的点。然后,我需要在Outlook(资源管理器/检查器)中知道鼠标在哪里

第一个想法-仅Outlook和Word对象模型。 正如您在问题中看到的,我的第一个想法是使用Word中可以使用的相同窗口对象,并实现RangeFromPoint方法。但她决定在Outlook中不支持这一点。所以这是一条死胡同

这里的第二个选择是使用其中一个或两个

Selection.Information(Word.WdInformation.wdHorizontalPositionRelativeToPage)
Selection.Information(Word.WdInformation.wdVerticalPositionRelativeToPage)
和/或

Selection.Information(Word.WdInformation.wdHorizontalPositionRelativeToTextBoundary)
Selection.Information(Word.WdInformation.wdVerticalPositionRelativeToTextBoundary)
垂直相对页面始终返回-1,即使文本清晰可见。 “相对于文本边界”返回了数字,它们随位置而变化,但在Outlook检查器中,我没有计算出边界的位置。利润率对我没有帮助。这可能是一种方法,但我没有解决它

i自动化或自动化 我没有这些方面的经验,但是我尝试在Outlook2007和Outlook2010上获取文本模式失败。我之所以给这些版本命名,是因为我在这里发现了一些问题,报告说它们在2013年取得了成功。我认为微软当时故意试图隐藏邮件的正文,以阻止ummm减慢电子邮件病毒的传播速度

WinApi 电子邮件的文本正文位于WwG类的窗口中,该窗口的内容不可见。你会得到“消息”作为文本。看起来这里也是MS故意这么做的。因此,试图将文本置于某个位置是行不通的

WinApi和Word对象模型的组合 我发现的解决方案是结合使用WinApi和Word,它可以与Explorer的阅读窗格和所有检查器一起使用

  • 接收窗口中有点的鼠标悬停事件(\u Outlook的WwG类)
  • 使用SendMessage并使用WM_LBUTTONDOWN标志将消息发送到此窗口
  • 从Inspector.WordEditor方法获取Word文档
  • 选定的当前范围将是鼠标在文本中的位置
  • 将范围扩展到单词或您需要的任何内容,现在您就拥有了鼠标下的内容
对于Outlook中的只读窗口,用户看不到插入符号,但它仍然存在,可以找到并使用

我还没有在正在起草的Outlook项目上实现这一点(光标正在使用且可见),但我想我必须将所选内容移动到鼠标位置,然后将其移回才能实现它。我可以想象这对一些用户来说不是最好的

编辑 有一个问题我无法解决。通过向窗口发送单击,您可以单击该点上的内容。如果那里有超链接,如邮件项目中的电子邮件地址,则它会跟随超链接。我无法正确解决这个问题。我在WinProc中发现的唯一一件事是,当鼠标位于超链接上时,Outlook会显示工具提示,并显示WM_USER+2消息。侦听此消息,如果收到此消息,请勿单击