2010-10-06 36 views
3

问候大家的鼠标光标下,获取这个词在Windows

我和一个朋友正在讨论一个新项目的可能性:一个翻译程序,只要你将鼠标悬停在任何文字中的任何控制,将弹出一个翻译,甚至是静态的,不可编辑的。我知道有很多浏览器插件可以在网页上做这种事情;我们正在考虑如何在系统范围内完成它(在Windows上)。

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

我偶然发现了这个(专有)应用程序,它确实非常正是我们想做的事:http://www.gettranslateit.com/

不知何故,他们能够得到确切的词,用户悬停在几乎任何应用程序(这似乎在一些应用程序中遇到麻烦,特别是Windows资源管理器)。它甚至以某种方式从明显的自定义绘制控件中抓取文本。起初我认为它一定是使用OCR。但即使当我缩小字体到文本变得完全不可读时,它仍然可以完美地识别单词。 (但是,如果我将字体更改为Wingdings,它不会识别任何内容,但也许这是设计?)

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

编辑:它不适用于Wingdings,但它确实与其他一些无意义的字体一起工作,所以我已经证实它不能被OCR。

回答

1

你可以捕捉到GDI调用文本输出到显示器,然后找出哪些字的边框光标落在英寸

+0

啊哈!果然,当我用dumpbin看一下(谢谢杰夫),看起来这正是他们正在做的。 – 2010-10-07 00:32:06

+1

@Paul:你记得确切地使用过哪些电话吗? – Claudiu 2011-04-28 15:11:56

1

嗯,GDI控制就可以得到控制的位置和大小,你通常可以得到字体信息。例如,对于static text controls,您将使用WM_GETFONT。然后,一旦你有了,你可以得到相对于控件位置的鼠标位置,并使用font functions之一,或许像GetTextExtentPoint32这样的东西来找出光标下的内容。我敢肯定,答案就在于这个方向......

您可以在其他应用程序上运行dumpbin /imports并查看他们正在调用哪些API。