将其他应用程序中的选定文本获取到自己的C#应用程序中

本文关键字:应用程序 获取 自己的 文本 其他 | 更新日期: 2023-09-27 18:21:35

我有一个C#应用程序,它可以正确响应全局热键。如果按下全局热键,我想从另一个具有焦点的应用程序中获取选定的文本。

我测试了本机Win32 Api,然后是SendKeysCTRL+C、剪贴板…),现在是Microsoft UI Automation!问题是,这只适用于记事本,但不适用于Internet Explorer、Word或其他应用程序。

我认为一定有比我现有的代码更好的解决方案。我读到发送CTRL + C应该可以正常工作,但也只能在记事本中工作。

以下是当全局热键被触发时我调用的方法:

    public String GetSelectedTextFromApp()
    {
        String output = "";
        AutomationElement focused = AutomationElement.FocusedElement;
        object pattern;
        TextPatternRange[] trs;
        if (focused.TryGetCurrentPattern(TextPattern.Pattern, out pattern))
        {
            TextPattern tp = (TextPattern)pattern;
            trs = tp.GetSelection();
            output = trs[0].GetText(-1);
        }
        return output;
    }

将其他应用程序中的选定文本获取到自己的C#应用程序中

您试图自动化的控件可能没有实现TextPattern。它可能只实现ValuePattern。此外,您关注的控件可能不是实际包含文本的控件,而是一个包装控件,在该控件下您将发现一个实现上述模式的AutomationElement。另一种可能性是,正如Andrii所说,控件根本不支持UIA(尽管我发现在MS Word的情况下很难相信)。

在这种情况下,使用UISpy.exe是值得的,它将帮助您查看要自动化的应用程序的可视化树。您还可以看到每个AutomationElement支持的Pattern。您也可以在每个AutomationElement上调用GetSupportedPatterns(),以查看当前支持哪些Pattern