123   1  /  3  页   跳转

[版聊] VB代码谁能看懂?

VB代码谁能看懂?

呃,本来想找一段用C#写的实现跑卡自动登录的代码(因为跑卡每天登陆持续30天有礼物送),然后我自己修改成每天自动登陆一次然后退出(因为我们就要开学了),结果就找到了这些……

'VB代码好晕啊
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)

'定义变量  //插一句,怎么声明常量也没有数据类型呢?
Const HKEY_LOCAL_MACHINE = &H80000002
Const KEY_QUERY_VALUE = &H1

Const BM_CLICK = &HF5
Const WM_SETTEXT = &HC
Const GW_HWNDNEXT = 2

'获得跑跑卡丁车执行文件路径
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

'以下是查找窗口 Button 的代码:
Private Function MyFindWindowDistrict() 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
MyFindWindowDistrict = hLastWin
End Function
'举例: Dim hLastWin as Long
' hLastWin = MyFindWindow()

'以下是查找窗口 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
'举例: Dim hLastWinEdit as Long
' hLastWin = MyFindWindowEdit()

'以下是查找窗口 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资源
Sleep (1000)
'转让控制权,以便让操作系统处理其它的事件。
DoEvents
hLastWinDistrict = MyFindWindowDistrict()
'获取按钮语柄就退出循环
If hLastWinDistrict <> 0 Then
Exit Do
End If
'循环结束
Loop
'获得按钮语柄
hLastWinDistrict = MyFindWindowDistrict()
'向单选按钮发送BM_CLICK消息
SendMessage hLastWinDistrict, BM_CLICK, 0, 0
'获得文本框语柄
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


用户系统信息:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Editor 3.0 - http://www.e-ditor.com; .NET CLR 2.0.50727; TheWorld)
分享到:
gototop
 

回复:VB代码谁能看懂?

VB我就没学完
gototop
 

回复:VB代码谁能看懂?

电脑盲路过


gototop
 

回复:VB代码谁能看懂?

VB里面定义常量不需要写类型,系统自动判断
其他还有什么问题吗
gototop
 

回复:VB代码谁能看懂?

只能看懂易语言的路过
gototop
 

回复:VB代码谁能看懂?

别的工具不能做吗?

先定时

到时自动运行kartrider.exe

然后等待登录窗口,直到登录窗口显示.

然后模拟键盘输入帐号密码即可


gototop
 

回复: VB代码谁能看懂?

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#代码还是不行……
gototop
 

回复:VB代码谁能看懂?

跟窗口句柄有关的API我都没用过……
gototop
 

回复:VB代码谁能看懂?

最简单的,用AUITV3,相信聪明的楼主一看就看明白了.

Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)
Run('kartrider.exe')
Sleep(5000)
WinWait("Login","开始游戏!")
If Not WinActive("Login","开始游戏!") Then WinActivate("Login","开始游戏!")
WinWaitActive("Login","开始游戏!")
Sleep(50)
Send("zhanghao")
Sleep(50)
Send("{TAB}")
Send("mima")
Send("{enter}")
Sleep(50)


gototop
 

回复 6F 鬼鬼小猫咪 的帖子

可是,怎么判断进入窗口后先激活的是哪个TextBox呢?(就是说,光标会停留在输入账号的文本框上还是停留在输入密码的文本框上呢?)
gototop
 
123   1  /  3  页   跳转
页面顶部
Powered by Discuz!NT