4

有一些 Win OS API 调用可以让人们从屏幕上获取文本

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

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

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

有人可以指出我获得此功能的正确方向吗?

4

4 回答 4

3

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

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

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

于 2009-02-05T08:09:23.350 回答
1

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

在 Delphi 中,您可以使用此功能(感谢下面的彼得)

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;

问候,
利文

于 2009-02-05T08:10:08.530 回答
0

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

当前的 API 称为Windows 自动化 API。通常描述如何执行此操作超出了 Stack Overflow 答案的范围,因此我只是提供了文档的链接。

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

请注意,这两个 API 的文档既是为构建无障碍工具(如屏幕阅读器)的开发人员编写的,也是为编写希望与这些无障碍工具兼容的应用程序的开发人员编写的。

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

于 2017-10-27T23:18:58.920 回答
-1

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

于 2009-02-05T08:07:01.360 回答