如何从屏幕上获取文本

时间:2009-02-05 07:59:07

标签: windows winapi ocr

有一些Win OS API调用,或者让人们从屏幕上获取文本

不是通过获取快照然后对其进行OCR,而是通过API

这个想法是获取用户指向并点击的鼠标下的文本。

这就是Babylon(http://www.babylon.com)和1-Click Answers(http://www.answers.com/main/download_answers_win.jsp)等工具以及其他许多工具的使用方式。

有人能指出我正确的方向来获得这项功能吗?

4 个答案:

答案 0 :(得分:2)

没有直接获取文字的方法。应用程序可以以多种不同的方式呈现文本(Windows API就是其中之一),并且在呈现之后 - 它只是一堆像素。

然而,您可以尝试的方法是直接在鼠标下找到窗口并尝试从中获取文本。这在大多数标准Windows控件(标签,文本框等)上都可以正常工作。但是在Internet浏览器上不起作用。

我认为您可以做的最好的事情是使您的应用程序以上述方式支持尽可能多的不同(通用)控件。

答案 1 :(得分:1)

您可以使用GetWindowText API获取每个窗口的文本。可以使用GetCursorPos API找到鼠标位置。

在Delphi中你可以使用这个功能(对Peter Peter赞不绝口)

Function ChildWindowUnderCursor: HWND;
Var
  hw, lasthw: HWND;
  pt, clientpt: TPoint;
Begin
  Result := 0;
  GetCursorPos( pt );
  // find top-level window under cursor
  hw := WindowFromPoint( pt );
  If hw = 0 Then Exit;

  // look for child windows in the window recursively
  // until we find no new windows
  Repeat
    lasthw := hw;
    clientpt := Pt;
    Windows.ScreenToClient( lasthw, clientpt );
    // Use ChildwindowfromPoint if app needs to run on NT 3.51!
    hw := ChildwindowFromPointEx( lasthw, clientpt, CWP_SKIPINVISIBLE );
  Until hw = lasthw;
  Result := hw;
End;

的问候,
利芬

答案 2 :(得分:0)

Windows提供了无障碍工具的API,例如盲人的屏幕阅读器。 (较新的版本也用于其他目的,如UI自动化和测试。)它适用于许多应用程序,甚至大多数浏览器在不使用标准Windows控件的情况下呈现自己的内容。它不适用于所有应用程序,但在大多数情况下,它可用于计算鼠标下的文本。

当前的API称为Windows Automation API。描述如何一般地执行此操作超出了Stack Overflow答案的范围,因此我只提供了文档的链接。

首次发布此问题时广泛使用的旧API称为Microsoft Active Accessibility API。与现代API一样,此处的范围过于宽泛,无法在此详细说明。

请注意,这两个API的文档都是为构建可访问性工具(如屏幕阅读器)的开发人员以及编写希望与这些辅助功能工具兼容的应用程序的开发人员编写的。

基本思想是可访问性工具获取目标应用程序窗口提供的COM接口,并且它可以使用这些接口来确定控件及其文本以及它们在逻辑上和空间上的相关性。由标准Windows控件组成的应用程序大多数是自动支持的。具有自定义UI实现的应用程序必须提供这些接口。幸运的是,重要的浏览器,如主流浏览器,已经完成了支持这些接口的工作。

答案 3 :(得分:-1)

我认为它叫做剪贴板。我打算打赌这些程序注入点击和双击&键盘事件,然后复制项目进行检查。或者,他们使用Windows文本控件获取jiggy,并以这种方式获取内容。我怀疑由于安全问题,这些工具在vista中也存在问题。