modAutoLogin.bas
'声明函数
Private Declare Function
FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function
FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function
SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function
GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
Private Declare Function
RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function
RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function
RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Sub
Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
以上是调用了一些API函数啊'定义变量 //插一句,怎么声明常量也没有数据类型呢?
Const HKEY_LOCAL_MACHINE = &H80000002
Const KEY_QUERY_VALUE = &H1
Const BM_CLICK = &HF5
Const WM_SETTEXT = &HC
Const GW_HWNDNEXT = 2
这些常量是什么玩意就看不懂了,ms是注册表键和像句柄一样的东西'获得跑跑卡丁车执行文件路径
Private Function GetValue(sValue) As Long
Dim lBuffer As Long, sBuffer As String, hKey As Long, lType As Long
rtn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\TianCity\PopKart\M01", 0, KEY_QUERY_VALUE, hKey)
If rtn <> 0& Then
GetValue = rtn
Exit Function
End If
从注册表获取跑卡路径,看懂了GetValue = RegQueryValueEx(hKey, "Install", 0, lType, ByVal 0, lBuffer)
lBuffer = 255
sBuffer = Space(lBuffer)
GetValue = RegQueryValueEx(hKey, "Executable", 0, lType, ByVal sBuffer, lBuffer)
sValue = Left(sBuffer, InStr(sBuffer, Chr(0)) - 1)
RegCloseKey hKey
End Function
又不懂了,IBuffer、sBuffer是干什么用的'以下是查找窗口 Button 的代码:
Private Function MyFindWindowDistrict() As Long
调用的上面引用的API,但是为什么不接收返回值呢?'父窗口类名数组
Dim A_szClassName(2) As String
A_szClassName(0) = "SpLoginDialog"
A_szClassName(1) = "Button"
'父窗口标题数组
Dim A_szWinName(2) As String
A_szWinName(0) = "Login"
A_szWinName(1) = "电信赛车场(二区)"
'首先求得顶级父窗口
Dim hLastWin As Long
hLastWin = FindWindow(A_szClassName(0), A_szWinName(0))
'逐次用FindWindowEx函数求出各级子窗口
For i = 1 To 1
hLastWin = FindWindowEx(hLastWin, 0, A_szClassName(i), A_szWinName(i))
Next i
MyFindWindowDistrict = hLastWin
End Function
求各窗口句柄'以下是查找窗口 Edit 的代码:
Private Function MyFindWindowEdit() As Long
'父窗口类名数组
Dim A_szClassName(2) As String
A_szClassName(0) = "SpLoginDialog"
A_szClassName(1) = "Edit"
'父窗口标题数组
Dim A_szWinName(2) As String
A_szWinName(0) = "Login"
A_szWinName(1) = ""
'首先求得顶级父窗口
Dim hLastWin As Long
hLastWin = FindWindow(A_szClassName(0), A_szWinName(0))
'逐次用FindWindowEx函数求出各级子窗口
For i = 1 To 1
hLastWin = FindWindowEx(hLastWin, 0, A_szClassName(i), A_szWinName(i))
Next i
MyFindWindowEdit = hLastWin
End Function
又不知所云(动词,原成语不是这个意思)了'以下是查找窗口 Button 的代码:
Private Function MyFindWindowButton() As Long
'父窗口类名数组
Dim A_szClassName(2) As String
A_szClassName(0) = "SpLoginDialog"
A_szClassName(1) = "Button"
'父窗口标题数组
Dim A_szWinName(2) As String
A_szWinName(0) = "Login"
A_szWinName(1) = "开始"
'首先求得顶级父窗口
Dim hLastWin As Long
hLastWin = FindWindow(A_szClassName(0), A_szWinName(0))
'逐次用FindWindowEx函数求出各级子窗口
For i = 1 To 1
hLastWin = FindWindowEx(hLastWin, 0, A_szClassName(i), A_szWinName(i))
Next i
MyFindWindowButton = hLastWin
End Function
'举例: Dim hLastWinButton as Long
' hLastWin = MyFindWindowButton()
开始找“登录”按钮了Private Sub Main()
'在紧接着出错语句之后的那条语句处恢复程序执行
On Error Resume Next
//为什么出错了才继续?Dim StrMO1Path As String, hLastWinDistrict As Long, hFirstWinEdit As Long
Dim hLastWinEdit As Long, hLastWinButton As Long, rShell As String
'运行跑跑卡丁车,判断是否在跑跑卡丁车根目录,然后到注册表中读取
If Dir("KartRider.exe") = "KartRider.exe" Then
rShell = Shell("KartRider.exe")
Else
'读取跑跑卡丁车执行文件路径
GetValue StrMO1Path
rShell = Shell(StrMO1Path, vbNormalFocus)
If rShell = 0 Then
MsgBox "无法找到执行文件", vbCritical, "运行出错"
End
Exit Sub
End If
End If
启动跑卡'获得按钮语柄
hLastWinDistrict = MyFindWindowDistrict()
'进入循环判断
Do While hLastWinDistrict = 0
'延迟1秒,因为它太占CPU资源
不只是1秒吧?我的机子没30秒启不来Sleep (1000)
'转让控制权,以便让操作系统处理其它的事件。
DoEvents
hLastWinDistrict = MyFindWindowDistrict()
'获取按钮语柄就退出循环
If hLastWinDistrict <> 0 Then
Exit Do
End If
'循环结束
Loop
'获得按钮语柄
hLastWinDistrict = MyFindWindowDistrict()
'向单选按钮发送BM_CLICK消息
SendMessage hLastWinDistrict, BM_CLICK, 0, 0
调用API发送消息'获得文本框语柄
hFirstWinEdit = MyFindWindowEdit()
'设置文本框的值
SendMessage hFirstWinEdit, WM_SETTEXT, 0, ByVal "帐号"
'返回下一个窗口的句柄
hLastWinEdit = GetNextWindow(hFirstWinEdit, 2)
SendMessage hLastWinEdit, WM_SETTEXT, 0, ByVal "密码"
hLastWinButton = MyFindWindowButton()
'向“开始”按钮发送BM_CLICK消息
SendMessage hLastWinButton, BM_CLICK, 0, 0
登录!'退出
End
End Sub
可是,顶多是看懂流程,怎么手动转换成C#代码还是不行……