Anyone knows how to get selected text from other application using UI Automation and .Net?
http://msdn.microsoft.com/en-us/library/ms745158.aspx
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);
}
}
}
}
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);
}
}
}
}