事先打開的Powershell或cmd窗口中的文本,用其餘方式難以拿到。可是用UI Automation能夠輕鬆獲取。
本工具在窗體上加入了一個Timer控件,每秒鐘都查找桌面上是否有Powershell或cmd窗口,若是有就獲取文本區域的內容。
代碼以下:
using System; using System.Windows.Automation; using System.Windows.Forms; using System.Text.RegularExpressions; namespace PowerShellTracker_CS { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void timer1_Tick(object sender, EventArgs e) { PropertyCondition PC1 = new PropertyCondition(property: AutomationElement.ControlTypeProperty, value: ControlType.Window); PropertyCondition PC2 = new PropertyCondition(property: AutomationElement.ClassNameProperty, value: "ConsoleWindowClass"); AutomationElement PS = AutomationElement.RootElement.FindFirst(scope: TreeScope.Children, condition: new AndCondition(PC1,PC2)); if (PS == null) {} else {PropertyCondition PC3 = new PropertyCondition(property: AutomationElement.NameProperty, value: "Text Area"); PropertyCondition PC4 = new PropertyCondition(property: AutomationElement.ControlTypeProperty, value: ControlType.Document); AutomationElement TA = PS.FindFirst(scope: TreeScope.Children, condition: new AndCondition(PC3, PC4)); if(TA == null) { textBox1.Text = "未找到窗口。"; } else { TextPattern TP = (TextPattern)TA.GetCurrentPattern(TextPattern.Pattern); System.Windows.Automation.Text.TextPatternRange TR = TP.DocumentRange; string Source= TR.GetText(-1); MatchCollection MC= Regex.Matches(Source, ".+"); Source =""; string LastLine = ""; foreach(Match match in MC) { if (match.Value == "\r") { } else { Source += match.Value + "\r\n"; LastLine = match.Value; } } textBox1.Text = Source + "最後一行是:" + LastLine; textBox1.SelectionStart = textBox1.TextLength; textBox1.ScrollToCaret(); } } } } }
對應的VB.NET代碼以下:shell
Imports System.Windows.Automation Imports System.Windows.Forms Imports System.Text.RegularExpressions Public Class Form1 Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Dim PC1 As PropertyCondition = New PropertyCondition([property]:=AutomationElement.ControlTypeProperty, value:=ControlType.Window) Dim PC2 As PropertyCondition = New PropertyCondition([property]:=AutomationElement.ClassNameProperty, value:="ConsoleWindowClass") Dim PS As AutomationElement = AutomationElement.RootElement.FindFirst(scope:=TreeScope.Children, condition:=New AndCondition(PC1, PC2)) If PS Is Nothing Then
Else
Dim PC3 As PropertyCondition = New PropertyCondition([property]:=AutomationElement.NameProperty, value:="Text Area") Dim PC4 As PropertyCondition = New PropertyCondition([property]:=AutomationElement.ControlTypeProperty, value:=ControlType.Document) Dim TA As AutomationElement = PS.FindFirst(scope:=TreeScope.Children, condition:=New AndCondition(PC3, PC4)) If TA Is Nothing Then TextBox1.Text = "未找到窗口。"
Else
Dim TP As TextPattern = CType(TA.GetCurrentPattern(TextPattern.Pattern), TextPattern) Dim TR As Text.TextPatternRange = TP.DocumentRange Dim Source As String = TR.GetText(-1) Dim MC As MatchCollection = Regex.Matches(Source, ".+") Source = ""
Dim LastLine As String = ""
For Each match As Match In MC If match.Value = vbCr Then
Else Source += match.Value & vbCrLf LastLine = match.Value End If
Next TextBox1.Text = Source & "最後一行是:" & LastLine TextBox1.SelectionStart = TextBox1.TextLength TextBox1.ScrollToCaret() End If
End If
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load With Me.Timer1 .Interval = 1000 .Enabled = True
End With
End Sub
End Class