我们必须从现有的VB6应用程序中读取文本。因此我们使用了kernel32中的FindWindow,GetWindowText和EnumChildWindows方法,并且可以枚举和读取此过程中显示的文本。
我们可以使用我们的方法读取90%的文本,但是通常有一个我们无法阅读的特定控件(或框)。
我们无法使用UI间谍类型程序来定位我们需要阅读的文本,所以我认为它们必须使用GDI / GDI +将其直接渲染到屏幕上。他们不能使用控件或窗口来呈现我们需要的文本。
有没有办法确定他们如何呈现文本,并可能阅读它?
我们不想抓住窗口的hDC并将其渲染到位图上,并以某种方式反向CAPTCHA文本......这可能是一场噩梦。
解决方案:我们发现可以使用此框中仅查找2-3个短语而不是实际对文本进行OCR处理。所以我们要将它渲染成位图并将其与2-3个预先存储的位图进行比较,这样我们就可以逐个像素地进行比较。
最佳答案将我们带到了这个解决方案。
答案 0 :(得分:1)
如果他们直接绘制到表面,没有一些奇怪的OCR内容就无法获得文本。
更新:在考虑了你的问题之后,我认为做你所描述的(抓住窗口的hDC并从中创建位图)将是相对简单的任务(相对于试图拦截首先呈现文本的API调用而言。)
例如,它不像在手写上做OCR那么困难。只要您可以确定Visual Basic 6应用程序用于绘制文本的字体,并且只要您想要刮取的文本每次都被绘制到表单上的相同位置,就可以相对容易地打破将文本绘制成离散字符(作为微小的小位图),然后将每个字符与预先生成的字符集进行比较,这些字符集是使用相同大小的相同字体绘制的。字符在逐个像素的基础上完美匹配。如果程序在不同的系统上运行并使用不同的字体绘制文本,则可能会出现问题。