C++ 如何检索当前活动窗口光标下的单词?

C++ 如何检索当前活动窗口光标下的单词?,c++,winapi,C++,Winapi,如何在当前活动窗口上检索光标下的单词?我的想法是使用GetCursorPos()和WindowFromPoint()来获取句柄,并做一些事情,但是如何呢 想象一个字典应用程序,它读取光标下的文本,并解释其含义 编辑 我最终使用了stardict的dll,它的API钩子位于文本绘图上 你所要求的并不是微不足道的 一旦确定了光标下的窗口(别忘了还需要使用ChildWindowFromPoint()来深入查看嵌套窗口),就可以使用GetClassName()来确定它是什么类型的窗口 对于标准的RICH

如何在当前活动窗口上检索光标下的单词?我的想法是使用
GetCursorPos()
WindowFromPoint()
来获取句柄,并做一些事情,但是如何呢

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

编辑


我最终使用了stardict的dll,它的API钩子位于文本绘图上

你所要求的并不是微不足道的

一旦确定了光标下的窗口(别忘了还需要使用
ChildWindowFromPoint()
来深入查看嵌套窗口),就可以使用
GetClassName()
来确定它是什么类型的窗口

对于标准的
RICHEDIT
窗口,您可以使用
MapWindowPoints()
将屏幕绝对光标坐标转换为窗口内的客户端相对坐标,然后使用
EM_FINDWORDBREAK
EM_exsetel
EM_GETSELTEXT
消息来定位、高亮显示、,并在光标坐标处复制单词

对于标准的
EDIT
窗口,转换坐标后,可以使用
EM_CHARFROMPOS
消息来定位距离光标坐标最近的字符偏移量,然后使用
EM_GETTEXT
消息进行单行窗口,或者多行窗口的
EM_LINEFROMCHAR
EM_GETLINE
消息(使用
GetWindowLong(GWL_样式)
测试
ES_多行
样式),检索窗口文本,然后必须手动解析字符偏移量周围的文本


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

您必须知道此操作所需的API;这不明显。你在找MSAA


简而言之,您将编写一个MSAA客户端。通过调用
AccessibleObjectFromPoint
可以得到一个
IAccessible
指针。此指针提供在指定点访问对象属性的权限。

“任何窗口”都是不可能的。您需要知道窗口类以及它将响应哪些消息。特别是像PDF查看器这样的东西,无法提供这些信息。@Markransem你说得对,我现在修改了这个问题;有一种方法可以在大多数情况下使用吗?@MarkRansom:一个体面的PDF浏览器实际上很可能会放弃这些信息。事实上,这并不是一件小事。这就是为什么要使用MSAA或UIAutomation。它工作正常,但它可以读取所有内容(例如记事本中的所有文本),而不是一个单词,可能我错过了一些要点。这取决于每个MSAA服务器来决定返回的内容。记事本是一个简单的应用程序,只是一个编辑控件。它可能没有实现自己的
IAccessible
,而是重用编辑控件。@warl0ck当您找到一个适合您需要的解决方案时,如果其他人还没有发布代码来实现它,也许您可以?这对整个社区都是有益的。