查看Microsoft UI自動化庫,它附帶.Net 3.5和4.0。以下是4.0的代碼示例,只需添加對UIAutomationClient和UIAutomationTypes的引用即可。程序啓動計算器並按下一些按鈕。
Option Explicit On
Option Strict On
Imports System.Windows.Automation
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
''//Start the calculator
Using P = Process.Start("calc.exe")
''//Hack, pause for a bit while calculator starts
System.Threading.Thread.Sleep(2000)
''//Try and grab the calculator window
Dim CalcWindow = AutomationElement.FromHandle(P.MainWindowHandle)
''//Make sure we've got something
If CalcWindow Is Nothing Then Throw New ApplicationException("Could find calculator window")
''//Grab all of the calculator buttons
Dim Buttons = CalcWindow.FindAll(TreeScope.Descendants, New PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button))
If (Buttons Is Nothing) OrElse (Buttons.Count = 0) Then Throw New ApplicationException("Could not find any buttons on the calculator")
''//Grab individual buttons by label
Dim B5 = GetObjectByLabel(Buttons, "5")
Dim BAdd = GetObjectByLabel(Buttons, "Add")
Dim B7 = GetObjectByLabel(Buttons, "7")
Dim BEquals = GetObjectByLabel(Buttons, "Equals")
''//Press the buttons
DirectCast(B5.GetCurrentPattern(InvokePattern.Pattern), InvokePattern).Invoke()
DirectCast(BAdd.GetCurrentPattern(InvokePattern.Pattern), InvokePattern).Invoke()
DirectCast(B7.GetCurrentPattern(InvokePattern.Pattern), InvokePattern).Invoke()
DirectCast(BEquals.GetCurrentPattern(InvokePattern.Pattern), InvokePattern).Invoke()
End Using
End Sub
Private Shared Function GetObjectByLabel(ByVal objects As AutomationElementCollection, ByVal label As String) As AutomationElement
''//Sanity check
If objects Is Nothing Then Throw New ArgumentNullException("objects")
If label Is Nothing Then Throw New ArgumentNullException("label")
''//Loop through each looking by name
For Each B As AutomationElement In objects
If B.Current.Name = label Then Return B
Next
Return Nothing
End Function
End Class
UI自動化庫旨在與名爲控件的模擬客戶端一起工作,但它也適用於幾乎任何程序。如果你沒有很好地模擬你的程序,那麼你將不得不像上面那樣進行破解。
有大量關於這一主題閱讀:
你可能會發現它很有用間諜++檢查你的程序了。
這是不可能的,事件處理程序必須在進程中註冊。看看Managed Spy ++。但與程序供應商或作者合作是取得成功的最佳途徑。 – 2011-03-21 17:58:18