在Windows中获取鼠标光标下的单词

时间:2010-10-06 23:56:51

标签: windows automation accessibility translation nlp

向大家致意,

我和朋友正在讨论新项目的可能性:翻译程序只要您将鼠标悬停在任何控件中的任何单词上,即使是静态的,不可编辑的单词,也会弹出翻译。我知道有很多浏览器插件可以在网页上做这类事情;我们正在考虑如何在整个系统范围内(在Windows上)。

当然,关键的难点在于找出用户悬停的字样。我知道MSAA和自动化,但据我所知,这些东西只允许你获取控件的全部内容,而不是鼠标结束的特定单词。

我偶然发现了这个(专有)应用程序,它完全符合我们的要求:http://www.gettranslateit.com/

不知怎的,他们能够得到用户几乎在任何应用程序中都悬停的确切字样(在一些应用程序中似乎有问题,特别是Windows资源管理器)。它甚至以某种方式从明显的自定义绘制控件中抓取文本。起初我以为它必须使用OCR。但即使我将字体缩小到目前为止,文本变成一个完全不可读的blob,它仍然可以完美地识别单词。 (然而,如果我将字体改为Wingdings,它就不会识别任何东西。但也许这是设计的?)

关于它如何实现这项看似不可能的任务的任何想法?

编辑:它不适用于Wingdings,但它确实与其他一些废话字体一起使用,所以我确认它不能是OCR。

2 个答案:

答案 0 :(得分:2)

您可以捕获将文本输出到显示器的GDI调用,然后找出光标所在的单词边界框。

答案 1 :(得分:2)

嗯,对于GDI控件,您可以获取控件的位置和大小,通常可以获取字体信息。例如,使用static text controls,您将使用WM_GETFONT。然后,一旦你有了这个,你可以获得鼠标相对于控件位置的位置,并使用font functions之一,或许类似于GetTextExtentPoint32来确定光标下的内容。我很确定答案就在那个方向......

您可以在另一个应用程序上运行dumpbin /imports,看看他们正在调用哪些API。