如何在 Outlook 检查器中的某个点获取 text/range?
How to get text/range at a point in an Outlook Inspector?
我想知道某个点的文本,例如 Outlook 电子邮件。
在 Excel 和 Word 中,我可以获得 ActiveWindow。两个对象模型都提供了我正在使用的 RangeFromPoint 方法。
在 Outlook 中,Applicaion 对象确实有一个 ActiveWindow,但它 returns 是 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,我需要采取什么步骤?
例如;
- 将屏幕点转换为 window 保存文本(电子邮件正文)的 window 点
- 此时获取文本。
在 Window 中获取文本的最佳 WinAPI 是什么。是用 EM_GETSEL 发送消息吗?
我在这里尝试了一些东西。
为什么我想知道点文
我正在将自定义工具提示构建到办公室中。当鼠标悬停在一个点上时(通过使用 winapi 函数 TrackMouseEvent),我从 Windows 接收到鼠标所在的点。然后我需要在 Outlook (Explorer / Inspector) 中知道鼠标在什么地方。
第一个想法 - 仅 Outlook 和 Word 对象模型。
正如您在问题中看到的那样,我首先想到的是使用可以在 Word 中使用的相同 Window 对象并实现 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 或自动化
我没有这些经验,但是我尝试在 Outlook 2007 和 Outlook 2010 上获取 TextPattern 失败。我命名这些版本是因为我发现这里有问题报告他们在 2013 年成功了。我认为 MS 当时故意试图隐藏正文阻止 ummm 减缓电子邮件病毒的电子邮件。
WinApi
电子邮件的正文位于 Class _WwG 的 window 中,window 的内容不可见。你得到 "message" 作为文本。似乎MS也是故意这样做的。因此,试图在某个位置获取文本是行不通的。
WinApi与Word对象模型的结合
我找到的适用于资源管理器阅读窗格和所有检查员的解决方案是结合使用 WinApi 和 Word。
- 收到鼠标悬停事件,鼠标悬停在 window(_WwG Class for Outlook)
- 使用 SendMessage 并使用 WM_LBUTTONDOWN 标志向此 window 发送消息。
- 从 Inspector.WordEditor 方法获取 Word 文档。
- 当前选定的范围将是鼠标在文本中所处的位置。
- 将范围扩大到单词或您需要的任何内容,现在您拥有鼠标下的内容。
对于只读 windows,在 Outlook 中用户看不到插入符号,但它仍然存在并且可以找到和使用。
我还没有在正在起草的 Outlook 项目上实现这个(光标正在使用中并且可见),但我想我必须将选择移动到鼠标位置然后将其移回才能实现它。我可以想象这对某些用户来说不是最好的。
编辑
有一个问题我无法解决。通过向 window 发送点击,您可以点击该点的内容。如果那里有超链接,例如 mailItem 中的电子邮件地址,那么它会跟随超链接。我无法正确解决这个问题。我在 WinProc 中发现的唯一一件事是,当鼠标悬停在超链接上时,Outlook 会显示一个工具提示,并且有一个 WM_USER + 2 消息。收听此消息,如果收到此消息,请不要单击。
我想知道某个点的文本,例如 Outlook 电子邮件。
在 Excel 和 Word 中,我可以获得 ActiveWindow。两个对象模型都提供了我正在使用的 RangeFromPoint 方法。
在 Outlook 中,Applicaion 对象确实有一个 ActiveWindow,但它 returns 是 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,我需要采取什么步骤?
例如;
- 将屏幕点转换为 window 保存文本(电子邮件正文)的 window 点
- 此时获取文本。
在 Window 中获取文本的最佳 WinAPI 是什么。是用 EM_GETSEL 发送消息吗?
我在这里尝试了一些东西。
为什么我想知道点文 我正在将自定义工具提示构建到办公室中。当鼠标悬停在一个点上时(通过使用 winapi 函数 TrackMouseEvent),我从 Windows 接收到鼠标所在的点。然后我需要在 Outlook (Explorer / Inspector) 中知道鼠标在什么地方。
第一个想法 - 仅 Outlook 和 Word 对象模型。 正如您在问题中看到的那样,我首先想到的是使用可以在 Word 中使用的相同 Window 对象并实现 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 或自动化 我没有这些经验,但是我尝试在 Outlook 2007 和 Outlook 2010 上获取 TextPattern 失败。我命名这些版本是因为我发现这里有问题报告他们在 2013 年成功了。我认为 MS 当时故意试图隐藏正文阻止 ummm 减缓电子邮件病毒的电子邮件。
WinApi 电子邮件的正文位于 Class _WwG 的 window 中,window 的内容不可见。你得到 "message" 作为文本。似乎MS也是故意这样做的。因此,试图在某个位置获取文本是行不通的。
WinApi与Word对象模型的结合 我找到的适用于资源管理器阅读窗格和所有检查员的解决方案是结合使用 WinApi 和 Word。
- 收到鼠标悬停事件,鼠标悬停在 window(_WwG Class for Outlook)
- 使用 SendMessage 并使用 WM_LBUTTONDOWN 标志向此 window 发送消息。
- 从 Inspector.WordEditor 方法获取 Word 文档。
- 当前选定的范围将是鼠标在文本中所处的位置。
- 将范围扩大到单词或您需要的任何内容,现在您拥有鼠标下的内容。
对于只读 windows,在 Outlook 中用户看不到插入符号,但它仍然存在并且可以找到和使用。
我还没有在正在起草的 Outlook 项目上实现这个(光标正在使用中并且可见),但我想我必须将选择移动到鼠标位置然后将其移回才能实现它。我可以想象这对某些用户来说不是最好的。
编辑 有一个问题我无法解决。通过向 window 发送点击,您可以点击该点的内容。如果那里有超链接,例如 mailItem 中的电子邮件地址,那么它会跟随超链接。我无法正确解决这个问题。我在 WinProc 中发现的唯一一件事是,当鼠标悬停在超链接上时,Outlook 会显示一个工具提示,并且有一个 WM_USER + 2 消息。收听此消息,如果收到此消息,请不要单击。