2009-09-16 44 views
2

我們必須從現有VB6應用程序中讀取文本。所以我們在kernel32中使用FindWindow,GetWindowText和EnumChildWindows方法,並且可以在這個過程中枚舉和讀取顯示的文本。C# - 從現有流程中讀取文本

我們能夠使用我們的方法讀取90%的文本,但總體上有一個我們無法閱讀的特定控件(或框)。

我們不能使用UI間諜類型程序來定位我們需要閱讀的文本,所以我假設他們必須將它直接渲染到GDI/GDI +的屏幕上。他們不能使用控件或窗口來呈現我們需要的文本。

有沒有辦法確定他們如何渲染文本,並可能讀取它?

我們不想抓住窗口的hDC並將其渲染到位圖上,並以某種方式反向驗證文本......這可能是一場噩夢。

SOLUTION:我們發現僅僅在這個盒子裏查找2-3個短語,實際上可以用來對文本進行OCR處理。所以我們要把它渲染到一個位圖上,並將它與2-3個預先存儲的位圖進行比較,這樣我們只能逐個像素進行比較。

熱門答案帶給我們這個解決方案。

回答

1

如果他們直接繪製表面,沒有辦法讓文字沒有一些奇怪的OCR東西。

更新:想你的問題後,我認爲做你的描述(抓住窗口的hDC和創造,從它的位圖)將是一個相對容易的事情(相對於試圖攔截API調用那就是把文本放在第一位)。例如,它不會像手寫OCR那樣困難。只要您可以確定Visual Basic 6應用程序用於繪製文本的字體,並且只要您要刮取的文本每次都被繪製到表單上的相同位置,就會相對容易地破壞將文本繪製成離散字符(如小小的位圖),然後將每個字符與預先生成的字符集合進行比較,這些字符是用相同大小的相同字體繪製的。角色將逐個像素地完美匹配。

如果程序在不同的系統上運行並使用不同的字體繪製文本,則可能存在問題。

+0

有沒有辦法告訴他們如何渲染它?我已經嘗試了vb6反編譯器,但它吐出了一些不可讀的彙編程序。 – jonathanpeppers 2009-09-16 16:18:55

+0

他們可能使用Win32 API調用。它可能有可能以某種方式攔截這些電話,但那會是一些嚴重的低端問題,我會在你面前低頭。 :) – MusiGenesis 2009-09-16 16:26:00

+0

我可以看到從位圖獲取文本的位置是可能的,但我猜測這可能很耗時,並且可能本身就是一個項目。如果沒有其他辦法,我可以看到。如果沒有人對未來幾天有更好的想法,我會將你標記爲答案。 – jonathanpeppers 2009-09-17 13:33:14