2010-10-06 48 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。