首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Windows中获取光标下的单词?

如何在Windows中获取光标下的单词?
EN

Stack Overflow用户
提问于 2011-01-12 11:18:30
回答 6查看 16.3K关注 0票数 52

我想创建一个在光标下获取单词的应用程序(不仅仅是文本字段),但我不知道如何做到这一点。使用OCR是相当困难的。我唯一看到的工作就是Deskperience组件。他们支持“原生”的方式,但我认为他们的成本很高。现在我正在尝试弄清楚这是什么“原生”的方式(也许是某种钩子)。任何帮助都将不胜感激。

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-19 18:40:26

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

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

这是一个小的控制台应用程序代码,它将侦测其他应用程序的UI。运行它并将鼠标移到不同的应用程序上。每个应用程序对不同的"UI自动化模式“有不同的支持。例如,有值模式和文本模式,如下所示。

代码语言:javascript
复制
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没有办法克服这些限制,除非他们在计算机上安装内核驱动程序。
  • 一些应用程序不会向任何人公开任何东西,即使有适当的权限。例如,如果我正在编写一个银行应用程序,我不希望您窥探我的应用程序将显示的内容:-)。
  • 只有UI自动化文本模式支持才能提供比整个文本更多的信息(比如单词)。遗憾的是,IE和FF都不支持这种特定的模式,即使它们全局支持UI自动化。

因此,如果所有这些对你都不起作用,你将不得不深入研究,并使用OCR或形状识别技术。即使这样,也会有一些情况下你根本无法做到这一点(因为安全权限)。

票数 53
EN

Stack Overflow用户

发布于 2011-01-12 17:59:33

如果你想要“窥探”的应用程序本身正在绘制文本,那么这不是一件微不足道的事情。一种可能的解决方案是触发另一个应用程序通过使光标正下方的区域无效来绘制其窗口的一部分。

当另一个应用程序绘制时,您必须拦截文本绘制调用。一种方法是在另一个应用程序中注入代码,并拦截对绘制文本的GDI函数的调用。调试本机应用程序时,这就是visual studio用来实现断点的方法。为了测试这个想法,您可以使用像detours这样的库(但这对于商业用途是不免费的)。

您还可以检查应用程序是否支持Windows中的一种可访问性API,以方便盲人使用屏幕阅读器等功能。

需要注意的是:我自己没有做过任何事情。

票数 9
EN

Stack Overflow用户

发布于 2011-01-12 17:40:21

如果应用程序不仅需要处理.Net应用程序,我会从导入函数(P/Invoke)开始:

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

经过一些检查后,它看起来最好的方法(不幸的是也很难)是挂接到GDI文本渲染some discussion中。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4665045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档