【发布时间】:2010-10-05 18:50:47
【问题描述】:
有人知道如何使用 UI 自动化和 .Net 从其他应用程序中获取选定的文本吗?
【问题讨论】:
标签: c# winapi user-interface automation
有人知道如何使用 UI 自动化和 .Net 从其他应用程序中获取选定的文本吗?
【问题讨论】:
标签: c# winapi user-interface automation
这是另一种仅使用 UI 自动化的解决方案。 它从记事本和写字板中获取选定的文本。
// 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);
}
}
}
}
【讨论】: