如何用Vb.net查找到另外一个应用程序中的文本框控件,并实现赋值
我希望用自己写的应用程序,实现对另外一个应用程序的登陆框中的用户名和密码自动赋值,
考虑如下实现,
1.在自己的应用程序中(A)启动另外一个应用程序(B)
2.模拟B的菜单点击弹出登陆窗口
3.往B的登陆界面中的两个文本框赋值,然后模拟点击窗口上的确定按钮.
程序(A)代码如下
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Const WM_COMMAND As Integer = &H111
Private Const BM_CLICK = &HF5
Private Const WM_SETTEXT = &HC
Dim g3eHWnd As Integer = 0
Dim newProcess As Process = New Process()
newProcess.StartInfo.FileName = "c:\B.exe"
newProcess.Start()
newProcess.WaitForInputIdle()
'newPrecoess.WaitForExit(2000)
g3eHWnd = newProcess.MainWindowHandle '得到B的主窗口界面句柄
SendMessage(g3eHWnd, WM_COMMAND, 40117, 0&) '模拟B菜单操作,然后会弹出登陆窗口
'下面就不会写了
'我理解是这么来实现
'得到B的登陆窗口的句柄,然后递归查找上面的控件,得到需要的文本框的句柄,然后仍然用
'SendMessage 赋值 ,我不知道怎样才能得到刚弹出登陆窗口的句柄,并在上面找到我需要的文本框,
'用spy++ 看了登陆窗口,无法得到文本框ID,也无法从caption等来区分。
'查过一些例子,一定要用到EnumChildWindows么,我看不太懂,希望贴出代码来!
再有个问题就是,如果我在newProcess.WaitForInputIdle() 后,如果马上执行newProcess.MainWindowHandle
得不到数值,好像是程序的主窗口界面还没有加载完成,所以我又执行了'newPrecoess.WaitForExit(2000) 来等待两秒钟,
这个办法我知道不好,但是为什么阿?还有别的办法么,本来想用循环来求newProcess.MainWindowHandle 是否等于0来判断,
也不行,newProcess.MainWindowHandle 在代码里只能执行一次,如果第一次求得是0,以后永远都是0,为什么呢?如果解决呢