VB.NET操作另一个软件界面的文本框和按钮
但是这种方法有缺陷,软件重启后控件ID就变了,不好用
控件ID是通过SPY获取到的,16进制转成10进制得来的
Public Class Form1
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Declare Function GetDlgItem Lib "user32" (ByVal hDlg As IntPtr, ByVal nIDDlgItem As Integer) As IntPtr
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Declare Function SendMessageTimeout Lib "user32.dll" Alias "SendMessageTimeoutA" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer, ByVal fuFlags As Integer, ByVal uTimeout As Integer, ByRef lpdwResult As Integer) As Integer
Private Const BM_CLICK As Integer = &HF5
Private Const WM_SETTEXT As Integer = &HC
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim hWnd As IntPtr = FindWindow(Nothing, "Huaray GUI V2.0")
SendMessage(GetDlgItem(hWnd, 459666), WM_SETTEXT, 0, "文本框111")
SendMessage(GetDlgItem(hWnd, 722086), WM_SETTEXT, 0, "文本框222")
SendMessage(GetDlgItem(hWnd, 197400), BM_CLICK, 0, 0)
End Sub
End Class
另外一种方法,根据类名获取控件句柄
Public Class Form1
Private Declare Auto Function FindWindowEx Lib "user32.dll" (ByVal hWndParent As IntPtr, ByVal hWndChildAfter As IntPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
Private Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr
Private Const WM_SETTEXT As Integer = &HC
Private Const BM_CLICK As Integer = &HF5
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim hWndParent As IntPtr = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "WindowsForms10.Window.8.app.0.141b42a_r6_ad1", "亚纳秒光纤激光器软件 V1.9 BY HUARAY")
Dim hWndChildTabControl As IntPtr = FindWindowEx(hWndParent, IntPtr.Zero, "WindowsForms10.SysTabControl32.app.0.141b42a_r6_ad1", Nothing)
Dim hWndChildCssz As IntPtr = FindWindowEx(hWndChildTabControl, IntPtr.Zero, "WindowsForms10.Window.8.app.0.141b42a_r6_ad1", "参数设置")
Dim hWndChildPl1 As IntPtr = FindWindowEx(hWndChildCssz, IntPtr.Zero, "WindowsForms10.Window.8.app.0.141b42a_r6_ad1", "频率1")
Dim hWndChild As IntPtr = IntPtr.Zero
Dim i As Integer
i = 1
'遍历所有控件,但是顺序没有搞清楚,不是根据TabIndex
Do While True
hWndChild = FindWindowEx(hWndChildPl1, hWndChild, "WindowsForms10.EDIT.app.0.141b42a_r6_ad1", Nothing)
If hWndChild <> IntPtr.Zero Then
SendMessage(hWndChild, WM_SETTEXT, IntPtr.Zero, i)
i = i + 1
Else
Exit Do
End If
Loop
' hWndChild = FindWindowEx(hWndChildPl1, IntPtr.Zero, "WindowsForms10.EDIT.app.0.141b42a_r6_ad1", "13") '根据文本框内容找不到对应的文本框,Nothing和""效果一样
SendMessage(hWndChild, WM_SETTEXT, IntPtr.Zero, "dsdf")
' 点击按钮
SendMessage(hWndChild, BM_CLICK, IntPtr.Zero, IntPtr.Zero)
End Sub
End Class