'取得当前活动窗口的句柄
QQHwnd = GetForegroundWindow
'得到窗体caption
Dim S As String
S = String(80, 0)
Call GetWindowText(QQHwnd, S, 80)
S = Left(S, InStr(S, Chr(0)) - 1)
'RTX聊天窗口的格式是“与 XXX(1001) 对话中”,所以以后三个字判断是不是RTX聊天窗口
If Right(S, 3) = "对话中" Then
…………
'-------------------------------
'腾讯通RTX消息加密外挂 关键代码|
'-------------------------------
Private Sub Timer1_Timer()
On Error GoTo A:
Dim QQHwnd As Long, PHwnd As Long, RHwnd As Long, SHwnd As Long
'取得当前活动窗口的句柄
QQHwnd = GetForegroundWindow
'得到窗体caption
Dim S As String
S = String(80, 0)
Call GetWindowText(QQHwnd, S, 80)
S = Left(S, InStr(S, Chr(0)) - 1)
'RTX聊天窗口的格式是“与 XXX(1001) 对话中”,所以以后三个字判断是不是RTX聊天窗口
If Right(S, 3) = "对话中" Then
RHwnd = FindWindowEx(QQHwnd, 0, "Button", "密送")
'如果按钮已存在,则不需创建
If RHwnd = 0 Then
Dim gButtonHwnd As Long
Dim ret As RECT, FrmWidth As Long, Frmheight As Long
'取窗体的长宽,以定位创建的按钮
GetWindowRect QQHwnd, ret
FrmWidth = ret.Right - ret.Left
Frmheight = ret.Bottom - ret.Top
'创建一个“密送”按钮
gButtonHwnd& = CreateWindowEx(0&, "Button", "密送", WS_CHILD, FrmWidth - 388, Frmheight - 66, 70, 25, QQHwnd, 0&, App.hInstance, 0&)
Call ShowWindow(gButtonHwnd&, SW_SHOWNORMAL)
End If
'判断是否点击,如果点击,返回8
Dim A As Long
A = SendMessage(RHwnd, BM_GETSTATE, 0, 0)
If A = 8 Then
'如果点击了,则取发言框和发送按钮的句柄
PHwnd = FindWindowEx(QQHwnd, 0, "RichEdit20A", vbNullString)
SHwnd = FindWindowEx(QQHwnd, 0, "Button", "发送(&S)")
'获取文本长度
hLength = SendMessage(PHwnd, WM_GETTEXTLENGTH, 0, 0)
If hLength = 0 Then
MsgBox "对不起,不能发送空消息!", vbExclamation + vbSystemModal
Exit Sub
End If
'设置缓冲区
ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte
Call RtlMoveMemory(bArr(0), hLength, 2)
'发送 WM_GETTEXT 消息
Call SendMessage(PHwnd, WM_GETTEXT, hLength + 1, bArr(0))
Call RtlMoveMemory(bArr2(0), bArr(0), hLength)
'得到发言框的文本
Dim GetText As String
GetText = StrConv(bArr2, vbUnicode)
'将得到的文本处理后再加入文本框,这里的Encode()是我自定义的加密函数
SendMessage PHwnd, WM_SETTEXT, 0, ByVal "M383E1eQT2l2yVNZ" & Encode(GetText) & "D0tQxR7ZxRgSV2A2" '前后两串字符串为了解密时分割用
SendMessage SHwnd, BM_CLICK, 0, 0 '点击发送按钮
End If
End If
'监视收到的消息
Dim ReHwnd
ReHwnd = FindWindowEx(QQHwnd, 0, "RichEdit20A", vbNullString)
Do While ReHwnd > 0
ReHwnd = FindWindowEx(QQHwnd, ReHwnd, "RichEdit20A", vbNullString)
'获取文本长度
ReLength = SendMessage(ReHwnd, WM_GETTEXTLENGTH, 0, 0)
'RLength是上次解密时消息的长度,和现在取得的消息对比,如果大于上次的,则说明有消息来
'如果小于,则说明切换到另一个窗口或关掉窗口重新打开,则将RLength置0再判断
If ReLength < RLength Then RLength = 0
If ReLength > RLength Then
'设置缓冲区
ReDim bArr(ReLength + 1) As Byte, bArr2(ReLength - 1) As Byte
Call RtlMoveMemory(bArr(0), ReLength, 2)
'发送 WM_GETTEXT 消息
Call SendMessage(ReHwnd, WM_GETTEXT, ReLength + 1, bArr(0))
Call RtlMoveMemory(bArr2(0), bArr(0), ReLength)
'得到对话文本框的文本,即收到的消息
'Dim GetText As String
GetText = StrConv(bArr2, vbUnicode)
'Dim GetTextArry()
gettextarry = Split(GetText, "M383E1eQT2l2yVNZ") 'M383E1eQT2l2yVNZ前面加上的,以此为分隔
i = UBound(gettextarry)
'如果不止一条消息,刚全部翻译
If i > 1 Then
Dim GetTextL As String
GetTextL = gettextarry(0)
For ii = 1 To i
GTA = Split(gettextarry(ii), "D0tQxR7ZxRgSV2A2")
GetTextL = GetTextL & " " & Decode(GTA(0))'Decode()是自定义的解密函数,和Encode对应
GetTextL = GetTextL & GTA(1)
Next ii
SendMessage ReHwnd, WM_SETTEXT, 0, ByVal GetTextL & vbCrLf
'如果是一条,则只译最后一条
ElseIf i = 1 Then
Dim ReText As String
ReText = Decode(Left(gettextarry(i), Len(gettextarry(i)) - 18))
'把新加的取掉,新加的解密后再加入
GetText = Replace(GetText, "M383E1eQT2l2yVNZ" & Left(gettextarry(i), Len(gettextarry(i))), "")
'GetText = Replace(GetText, vbCrLf, vbCrLf & " ")
'将得到的文本处理后再加入文本框
SendMessage ReHwnd, WM_SETTEXT, 0, ByVal GetText & " " & ReText & vbCrLf
End If
ReLength = SendMessage(ReHwnd, WM_GETTEXTLENGTH, 0, 0)
RLength = ReLength
Exit Do
End If
Loop
Exit Sub
A:
MsgBox "Sorry!有错误发生!", vbExclamation + vbSystemModal
SendMessage ReHwnd, WM_SETTEXT, 0, ByVal "" '将内容清空,免得错误持续.
End Sub