2012-09-21 76 views
1

如何在當前活動窗口上檢索光標下的單詞?我的想法是使用GetCursorPos()WindowFromPoint()來獲得句柄,並做些什麼,但如何?如何檢索當前活動窗口的光標下的單詞?

想象一下,一個字典應用程序,它讀取光標下的文本,並解釋其含義。

編輯

我最終使用從星際譯王的dll,對文本繪製的API鉤子。

+3

「任何窗口」是不可能的。您需要知道窗口類以及它將響應的消息。特別是像PDF閱讀器這樣的東西無法給你提供這些信息。 –

+0

@MarkRansom你是對的,我現在修改了這個問題;對大多數情況有效嗎? – daisy

+0

@MarkRansom:一個體面的PDF查看器實際上很可能會放棄這些信息 – MSalters

回答

5

您必須知道所需的API;這並不明顯。你正在尋找MSAA,Microsoft Active Accessibility

總之,你會寫一個MSAA客戶端。通過調用AccessibleObjectFromPoint,你會得到一個IAccessible指針。該指針允許訪問指定點上的對象的屬性。

+0

它可以工作,但它讀取所有內容(例如記事本中的所有文本),而不是一個單詞,也許我錯過了一些要點 – daisy

+0

由每個MSAA服務器決定返回的內容。記事本是一個簡單的應用程序,只是一個編輯控件。它可能不會實現它自己的'IAccessible',但重用了編輯控件。 – MSalters

+0

@ warl0ck當您找到適合您需求的解決方案時,如果其他人尚未發佈代碼來執行此操作,也許您可​​以?這對整個社區會有好處。 –

0

你所要求的不是微不足道的實施。

一旦確定了光標下的哪個窗口(不要忘記,您還需要使用ChildWindowFromPoint()深入查看嵌套窗口),您可以使用GetClassName()來確定它是哪種類型的窗口。

對於標準RICHEDIT窗口,可以翻譯屏幕絕對光標座標到窗口內的客戶相對座標使用MapWindowPoints()然後用EM_FINDWORDBREAKEM_EXSETSELEM_GETSELTEXT消息來定位,突出顯示,並複製的字光標座標。

對於標準EDIT窗口,一旦已經翻譯的座標,則可以使用EM_CHARFROMPOS消息來定位字符最靠近光標偏移座標,然後使用EM_GETTEXT消息單行窗口或EM_LINEFROMCHAREM_GETLINE用於多行窗口的消息(使用GetWindowLong(GWL_STYLE)來測試ES_MULTILINE樣式),以便檢索窗口的文本,然後您將不得不手動分析字符偏移周圍的文本。

對於其他類型的窗口,特別是自定義控件,如果甚至有可能訪問窗口的文本,則必須做更多的工作。一些窗口響應WM_GETTEXT消息和/或GetWidnowText(),而其他窗口則不響應。

+0

的確,這不是微不足道的。這就是您使用MSAA或UIAutomation的原因。 –

相關問題