CodeGo.net>如何获取单词在Windows下的光标?

我想创建一个将单词放在光标下的应用程序(不仅适用于文本字段),但我找不到执行该操作的方法。 使用OCR非常困难。 我看到的唯一工作是Deskperience组件。 他们支持“本机”方式,但是我花了很多钱。 现在,我试图弄清楚这种“本机”方式是什么(也许以某种方式挂钩)。 任何帮助将不胜感激。

编辑:我找到了一种方法,但是它只能获取控件的整个文本。 知道如何从整个文本中仅获取光标下的单词吗?

blez asked 2020-02-13T18:13:43Z
6个解决方案
50 votes

在最新版本的Windows上,建议将信息从一个应用程序收集到另一个应用程序的方法(如果您当然不是目标应用程序的话)是使用UI自动化技术。Wikipedia非常适合以下方面的更多信息:Microsoft UI Automation

基本上,UI自动化将使用所有必要的手段来收集可以收集的内容

这是一个小的控制台应用程序代码,它将监视其他应用程序的UI。 运行它并将鼠标移到其他应用程序上。 每个应用程序对各种“ UI自动化模式”都有不同的支持。 例如,这里显示了“值”模式和“文本”模式。

static void Main(string[] args)
{
    do
    {
        System.Drawing.Point mouse = System.Windows.Forms.Cursor.Position; // use Windows forms mouse code instead of WPF
        AutomationElement element = AutomationElement.FromPoint(new System.Windows.Point(mouse.X, mouse.Y));
        if (element == null)
        {
            // no element under mouse
            return;
        }

        Console.WriteLine("Element at position " + mouse + " is '" + element.Current.Name + "'");

        object pattern;
        // the "Value" pattern is supported by many application (including IE & FF)
        if (element.TryGetCurrentPattern(ValuePattern.Pattern, out pattern))
        {
            ValuePattern valuePattern = (ValuePattern)pattern;
            Console.WriteLine(" Value=" + valuePattern.Current.Value);
        }

        // the "Text" pattern is supported by some applications (including Notepad)and returns the current selection for example
        if (element.TryGetCurrentPattern(TextPattern.Pattern, out pattern))
        {
            TextPattern textPattern = (TextPattern)pattern;
            foreach(TextPatternRange range in textPattern.GetSelection())
            {
                Console.WriteLine(" SelectionRange=" + range.GetText(-1));
            }
        }
        Thread.Sleep(1000);
        Console.WriteLine(); Console.WriteLine();
    }
    while (true);
}

实际上,Internet Explorer和Firefox支持UI自动化,但据我所知,Chrome不支持。 看到此链接:什么时候可以访问Google Chrome?

现在,这只是您工作的开始:-),因为:

  • 大多数情况下,所有这些都具有很大的安全隐患。 使用此技术(或直接Windows技术,例如WindowFromPoint)将需要足够的权限(例如,成为管理员)。 而且,除非他们在计算机上安装内核驱动程序,否则我认为DExperience无法克服这些限制。

  • 某些应用程序即使拥有适当的权限也不会向任何人公开任何内容。 例如,如果我正在编写银行应用程序,则不希望您窥探我的应用程序将显示的内容:-)。 出于相同原因,其他应用程序(例如带DRM的Outlook)将不会公开任何内容。

  • 仅UI自动化文本模式支持可以提供比整个文本更多的信息(如单词)。 las,即使IE和FF全局支持UI自动化,也不支持此特定模式。

因此,如果这一切都不适合您,则您将不得不更深入地研究并使用OCR或形状识别技术。 即使这样,在某些情况下您也根本无法做到(由于担保权)。

Simon Mourier answered 2020-02-13T18:14:31Z
9 votes

如果要“监视”的应用程序自己在绘制文本,则这并非易事。 一种可能的解决方案是通过使光标正下方的区域无效来触发另一个应用程序绘制其窗口的一部分。

当其他应用程序绘制时,您将不得不拦截文本绘制调用。 一种方法是在另一个应用程序中注入代码,并拦截对绘制文本的GDI函数的调用。 在调试本机应用程序时,Visual Studio会执行此操作以实现断点。 要测试这个想法,您可以使用绕行之类的库(但这并不是免费的商业用途)。

您还可以检查应用程序是否支持Windows中的一种辅助功能API,以方便盲人使用屏幕阅读器之类的东西。

一个警告:我自己还没有做任何事情。

answered 2020-02-13T18:15:05Z
7 votes

如果该应用程序不仅需要处理.Net应用程序,我将从导入功能(P /调用)开始:

  • WindowFromPoint
  • ChildWindowFromPointEx

稍后,您可以遍历控件并尝试根据类型从内部获取文本。 如果有时间,我将尝试发布此类代码。

经过一番检查之后,看来最好的方法(不幸的是也很困难)是加入GDI文本以进行一些讨论

baalazamon answered 2020-02-13T18:15:44Z
5 votes

我会回应帕特里克(Patricker)所说的话,但我认为没有可靠的方法可以做您想要的事情。

您可能获得了窗口文本或类似内容。 但是,如果光标位于不使用窗口文本存储其内容的窗口上方,该怎么办? Windows没有义务以特定方式存储其数据。

这最终使您指向字符识别,在这里您可以查看光标下方的像素并尝试找出其中有哪些单词。 但是这不仅非常琐碎,而且也不是万无一失的。 如果单词的一部分因为伸出窗口而看不见怎么办?

这绝对不是小事。 有几种方法可以解决它。 但是没有可靠的方法可以在所有窗口中使用。

Jonathan Wood answered 2020-02-13T18:16:18Z
2 votes

有一个使用OCR获取文本的SDK。 它不是免费的,但与其他产品相比非常便宜:[http://www.screenocr.com/screen-ocr-library-sdk.htm]他们有一个提供相同功能的应用程序,因此您也可以尝试演示。

Giorgi answered 2020-02-13T18:16:38Z
0 votes

为此,您需要采取多管齐下的方法。

UIA在许多应用程序中都可以使用,但是您需要进行实验以查看文本的返回位置。 它可以在元素,值或范围中。 即使在办公应用程序之间也没有一致性。

如果UIA失败,则枚举运行对象表(ROT)并检索指向ROT中注册的各种应用程序的COM指针。 然后,您可以将这些指针转换为基础办公类型:
例如:

enumerate ROT  - then
 wb = (Excel._Workbook)enumerator.Value;
string strText = wb.Application.ActiveCell.Text.ToString();

如果以上两种方法均失败,则请使用MODI中的免费OCR系统(Microsoft Office Document Imaging 12.0类型库)

RichardB answered 2020-02-13T18:17:16Z
translate from https://stackoverflow.com:/questions/4665045/how-to-get-the-word-under-the-cursor-in-windows