UI Automation “Selected text”

前端 未结 2 1099
南方客
南方客 2020-12-06 17:58

Anyone knows how to get selected text from other application using UI Automation and .Net?

http://msdn.microsoft.com/en-us/library/ms745158.aspx

相关标签:
2条回答
  • 2020-12-06 18:40

    Here is another solution using only UI Automation. It gets the selected text from Notepad and Wordpad.

    // Get only top level windows
    PropertyCondition condition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window);
    AutomationElementCollection windows = AutomationElement.RootElement.FindAll(TreeScope.Children, condition);
    List<AutomationElement> allDocuments = new List<AutomationElement>();
    
    foreach (AutomationElement window in windows)
    {
        string className = window.Current.ClassName;
        if (className == "Notepad" || className == "WordPadClass")
        {
            condition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Document);
            AutomationElementCollection documents = window.FindAll(TreeScope.Children, condition);
    
            if (documents.Count > 0)
            {
                allDocuments.Add(documents[0]);
            }
        }
    }
    
    // store all pieces of selected text here
    List<string> selectedText = new List<string>();
    
    // iterate through all documents found
    foreach (AutomationElement document in allDocuments)
    {
        object patternObj = null;
        if (document.TryGetCurrentPattern(TextPattern.Pattern, out patternObj) == true)
        {
            TextPattern textPattern = patternObj as TextPattern;
            TextPatternRange[] ranges = textPattern.GetSelection();
    
            foreach (TextPatternRange range in ranges)
            {
                string text = range.GetText(-1);
                if (text.Length > 0)
                {
                    selectedText.Add(text);
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-06 18:51
    private void button1_Click(object sender, EventArgs e) {
            Process[] plist = Process.GetProcesses();
    
            foreach (Process p in plist) {
                if (p.ProcessName == "notepad") {
    
                    AutomationElement ae = AutomationElement.FromHandle(p.MainWindowHandle);
    
                    AutomationElement npEdit = ae.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.ClassNameProperty, "Edit"));
    
                    TextPattern tp = npEdit.GetCurrentPattern(TextPattern.Pattern) as TextPattern;
    
                    TextPatternRange[] trs;
    
                    if (tp.SupportedTextSelection == SupportedTextSelection.None) {
                        return;
                    }
                    else {
                        trs = tp.GetSelection();
                        lblSelectedText.Text = trs[0].GetText(-1);
                    }
                }
            }
        }
    
    0 讨论(0)
提交回复
热议问题