【问题标题】:How should one retrieve the word under cursor, of current active window?应该如何检索当前活动窗口的光标下的单词?
【发布时间】:2012-09-21 02:25:27
【问题描述】:

如何在当前活动窗口中检索光标下的单词?我的想法是使用GetCursorPos()WindowFromPoint() 来获取句柄,然后做点什么,但是怎么做呢?

想象一个字典应用程序,它读取光标下的文本,并解释其含义。

编辑

我最终使用了来自 stardict 的 dll,它的 API 挂钩在文本绘制上。

【问题讨论】:

  • “任何窗口”是不可能的。您需要知道窗口类以及它将响应哪些消息。尤其是像 PDF 查看器这样的工具无法为您提供这些信息。
  • @MarkRansom 你说得对,我现在修改了问题;有没有适用于大多数情况的方法?
  • @MarkRansom:一个像样的 PDF 查看器实际上可能会放弃这些信息

标签: c++ winapi


【解决方案1】:

您必须知道为此所需的 API;这并不明显。您正在寻找 MSAA,Microsoft Active Accessibility

简而言之,您将编写一个 MSAA 客户端。通过调用AccessibleObjectFromPoint,你会得到一个IAccessible 指针。该指针可以访问指定点处对象的属性。

【讨论】:

  • 它有效,但它读取所有内容(例如记事本中的所有文本),而不是一个单词,也许我错过了一些要点
  • 由每个 MSAA 服务器来决定返回什么。记事本是一个简单的应用程序,只是一个编辑控件。它可能没有实现自己的IAccessible,而是重用了编辑控件。
  • @warl0ck 当您找到适合您需求的解决方案时,如果其他人尚未发布代码来执行此操作,也许您可​​以?这对整个社区都是有益的。
【解决方案2】:

您所要求的实施起来并非易事。

一旦您确定了光标下的窗口(别忘了您还需要使用ChildWindowFromPoint() 向下钻取嵌套窗口),您可以使用GetClassName() 来确定它是什么类型的窗口.

对于标准的RICHEDIT 窗口,您可以使用MapWindowPoints() 将屏幕绝对光标坐标转换为窗口内的客户端相对坐标,然后使用EM_FINDWORDBREAKEM_EXSETSELEM_GETSELTEXT 消息在光标坐标处定位、突出显示和复制单词。

对于标准的EDIT 窗口,一旦你翻译了坐标,你可以使用EM_CHARFROMPOS 消息来定位最接近光标坐标的字符偏移,然后使用EM_GETTEXT 消息作为单行窗口,或多行窗口的EM_LINEFROMCHAREM_GETLINE 消息(使用GetWindowLong(GWL_STYLE) 测试ES_MULTILINE 样式),检索窗口的文本,然后您必须手动解析字符周围的文本偏移量。

对于其他类型的窗口,尤其是自定义控件,您必须做更多的工作,如果甚至可以访问窗口的文本。有些窗口会响应WM_GETTEXT 消息和/或GetWidnowText(),而其他窗口则不会。

【讨论】:

  • 确实不是小事。这就是您使用 MSAA 或 UIAutomation 的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2011-04-20
相关资源
最近更新 更多