瑞星卡卡安全论坛

首页 » 综合娱乐区 » Rising茶馆 » VB代码谁能看懂?
安德倚天剑 - 2010-2-25 15:39:00
呃,本来想找一段用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)
罪人偷采白莲回 - 2010-2-25 15:41:00
VB我就没学完
鬼鬼小猫咪 - 2010-2-25 15:44:00
电脑盲路过
leo108 - 2010-2-25 15:45:00
VB里面定义常量不需要写类型,系统自动判断
其他还有什么问题吗
jmbt - 2010-2-25 15:46:00
只能看懂易语言的路过
鬼鬼小猫咪 - 2010-2-25 15:48:00
别的工具不能做吗?

先定时

到时自动运行kartrider.exe

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

然后模拟键盘输入帐号密码即可
安德倚天剑 - 2010-2-25 15:51:00
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#代码还是不行……:kaka6:
安德倚天剑 - 2010-2-25 15:52:00
跟窗口句柄有关的API我都没用过……:kaka6:
鬼鬼小猫咪 - 2010-2-25 15:53:00
最简单的,用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)
安德倚天剑 - 2010-2-25 15:55:00
可是,怎么判断进入窗口后先激活的是哪个TextBox呢?(就是说,光标会停留在输入账号的文本框上还是停留在输入密码的文本框上呢?)
鬼鬼小猫咪 - 2010-2-25 15:57:00
如果你上次登录过,默认是在密码上的.

如果你有N多号需要登录,可以无视我的代码.....
jmbt - 2010-2-25 15:58:00


引用:
原帖由 鬼鬼小猫咪 于 2010-2-25 15:48:00 发表
别的工具不能做吗?

先定时

到时自动运行kartrider.exe

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

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


使用易语言能简单点
思路是这样的

两个文本型变量
用户名=“。。。”
密码=“。。。”

运行:“KaritRider.exe“
计时器定时35秒
之后
复制变量 用户名的值
模拟键盘 Ctrl+V
复制变量 密码值
模拟键盘 Tab
模拟键盘 Ctrl+V
模拟键盘 Enter
计时器定时60秒
模拟键盘 Alt+F4
销毁()
安德倚天剑 - 2010-2-25 15:59:00


引用:
原帖由 鬼鬼小猫咪 于 2010-2-25 15:53:00 发表
最简单的,用AUITV3,相信聪明的楼主一看就看明白了.

Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)
Run('kartrider.exe')

帮我解释一下:kaka1:
Options函数里面设置的常量是什么意思?
WinWait函数是啥?
Send函数恐怕是SendKeys函数吧?

我想错了似乎,Send的参数写上{。。。}就是发送按键,写上普通字符串就是模拟键盘键入他们,不对吧?似乎是Keys.Enter呢,模拟键盘键入我只会SendKeys(Keys.。。。)
鬼鬼小猫咪 - 2010-2-25 16:01:00
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(50000)
Send("{ALT}"+"{F4}")


....

鬼鬼小猫咪 - 2010-2-25 16:01:00
额..我也不知道,本猫电脑盲.......

好像前面不写那些东西也可以的.:kaka12:
安德倚天剑 - 2010-2-25 16:04:00
啊啊啊啊
不要了不要了,无限制的SR我不要了
这程序太难写了
鬼鬼小猫咪 - 2010-2-25 16:05:00
找你朋友或者好友帮你登吧.唉.
安德倚天剑 - 2010-2-25 16:07:00
嗯,谢谢了
最硬的石头 - 2010-2-25 16:39:00
:kaka6: 原文的注释写的很不错了。。

那些API要是不懂的话,查msdn。。
最硬的石头 - 2010-2-25 16:39:00
有无限SR?
最硬的石头 - 2010-2-25 16:40:00
只要登陆?
鬼鬼小猫咪 - 2010-2-25 16:40:00
是的,从今天开始连续登录30天,获得蜜蜂SR(无限制)
米兰兰 - 2010-2-25 17:07:00
该用户帖子内容已被屏蔽
jmbt - 2010-2-25 17:56:00


引用:
原帖由 鬼鬼小猫咪 于 2010-2-25 16:40:00 发表
是的,从今天开始连续登录30天,获得蜜蜂SR(无限制)
蜜蜂SR好用吗?我是没有钱买跑跑卡丁车了
鬼鬼小猫咪 - 2010-2-26 8:55:00
还没给呢......要等30天以后
1輩吇筷楽 - 2010-2-26 9:38:00
VB100我看得懂:kaka5:
还有谁 - 2010-2-26 9:39:00
该用户帖子内容已被屏蔽
1
查看完整版本: VB代码谁能看懂?