拦截鼠标单击OLE容器中MS Word文档中的超链接?

时间:2017-11-10 13:05:43

标签: ms-word ole

我正在使用Delphi形式的OLE容器中使用Word,尽管IDE在很大程度上与此问题无关。

到目前为止,我一直无法找到解决上述问题的方法,而且我在我的应用程序中创建并维护了自己的文字处理程序,因为我无法找到拦截Word中超链接点击的方法。嵌入式MS Word将是理想的解决方案,除非Word不公开onHyperlinkClick事件。

我的嵌入式文字处理器需要接管对超链接点击的控制,因为它没有导航到特定网址,但会触发运行相当复杂的功能,我不能/不希望尝试在Word中处理

在没有MS Word事件的情况下,我猜这样做的唯一方法是通过Windows钩子。我对钩子不是很熟悉,并且对于这是否是解决问题的最佳方法表示感谢。为了它的工作,我需要钩子能够:

  1. 识别屏幕上的鼠标坐标(我假设是给定的)
  2. 拦截并阻止鼠标单击停止MS Word自行处理。
  3. 在MS Word中,我需要一个公开的函数,它将屏幕坐标转换为word文档中对象的位置。我已经浏览了Word VBA参考文献,并且找不到任何直接明显的功能,但我有一种感觉,我之前已经看到过对这样一个函数的引用。

    对于这是否是一种可行且明智的方法的任何反馈将不胜感激。

1 个答案:

答案 0 :(得分:0)

我找到了上面的答案。实现起来相当复杂。它涉及鼠标和键盘钩。

VBA for Word有一个RangeFromPoint函数,您可以查询该函数以找出鼠标光标下方的范围。然后,您查询范围对象以获取其超链接。

您无法在挂钩过程中查询范围,因为它会导致线程冲突。我添加了一个间隔为1毫秒的计时器,该计时器在挂钩程序中启用。如果您想自己处理链接,这会让生活变得困难。我决定查询mousedown而不是mousemove,因为后者可能会占用大量资源。因此,如果您希望以正常方式处理鼠标,则必须每次都禁用鼠标并在钩子程序之外进行模拟。

还有其他所有问题需要处理,例如z级别较高的其他窗口可能位于你的ole容器上。您需要检查光标是否属于这些窗口。

你还需要确保你没有处理在mousedown时按下特殊键(例如移位)的mousedown,否则你将禁用选择。

按Enter键处理链接的打开要容易得多。

如果Word提供了一个超链接点击事件,那将会容易得多!