【问题标题】:How to get text from the screen如何从屏幕上获取文本
【发布时间】:2009-02-05 07:59:07
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: windows winapi ocr


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      在 Delphi 中,您可以使用此功能(感谢 Peter below)

      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;
      

      问候,
      利文

      【讨论】:

        【解决方案3】:

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

        当前的 API 称为Windows Automation API。描述如何做到这一点一般超出了 Stack Overflow 答案的范围,所以我只是提供了一个文档链接。

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-02-23
            • 2012-05-16
            • 2022-10-23
            • 2023-01-29
            • 1970-01-01
            • 2019-03-23
            • 2021-06-12
            • 1970-01-01
            相关资源
            最近更新 更多