c# - 如何在 Windows 中获取光标下的单词?

标签 c# windows winapi hook ocr

我想创建一个应用程序来获取光标下的单词(不仅针对文本字段),但我找不到如何做到这一点。使用 OCR 非常困难。我见过的唯一工作是 Deskperience 组件。他们支持“本地”方式,但我认为它们花费很多。现在我正试图弄清楚这种“ native ”方式是什么(也许是某种方式的 Hook )。任何帮助将不胜感激。

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

最佳答案

在最新版本的 Windows 上,从一个应用程序收集信息到另一个应用程序的推荐方法(当然,如果您不拥有目标应用程序)是使用 UI 自动化 技术。 维基百科对于这方面的更多信息非常有用:Microsoft UI Automation

基本上,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);
}

据我所知,UI 自动化实际上受 Internet Explorer 和 Firefox 支持,但 Chrome 不支持。请参阅此链接:When will Google Chrome be accessible?

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

  • 大多数时候,所有这些都具有严重的安全隐患。使用此技术(或直接 Windows 技术,如 WindowFromPoint)将需要足够的权限(如管理员)。而且我认为 DExperience 没有任何方法可以克服这些限制,除非他们在计算机上安装内核驱动程序。

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

  • 只有 UI 自动化文本模式支持可以提供比整个文本更多的信息(如单词)。唉,IE 和 FF 都不支持这种特定模式,即使它们支持全局 UI 自动化。

因此,如果所有这些都不适合您,您将不得不深入研究并使用 OCR 或形状识别技术。即使这样,在某些情况下您也根本无法执行此操作(因为安全权限)。

关于c# - 如何在 Windows 中获取光标下的单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4665045/

相关文章:

c# - iMacros (Firefox) 通过 C# 控制

C# dot net core 单实例应用程序将参数传递给第一个实例

android - 用于分割二进制文件的 Windows 命令

c++ - 绘制 8bpp 灰度位图(非托管 C++)

javascript - 使用 jQuery 在每次输入按键时搜索列表项并隐藏其他项

c# - 了解服务结构参与者删除

c++ - 在 C++ 中更改 Windows 7 墙纸

python - 如何编写 Python 包/模块?

c++ - 如何知道 Winlogon 桌面何时准备好输入?

c++ - ERROR_IO_PENDING 后的多个 WriteFile