当然,我不是做QQ尾巴。
我想做个消息加密程序,在QQ点击发送的时候先将文本加密再发送出去。
难的是如何能在点击发送的时候不发送而是先做加密文本的动作?
请高手帮忙!谢谢!

解决方案 »

  1.   

    唉,郁闷啊,每次发了贴子后都是自己搞定问题。
    其实我的思路也很简单,但不一定是最好,这里说一下:
    1.在QQ窗口上创建一个按钮,详见http://community.csdn.net/Expert/topic/4064/4064373.xml?temp=.5738642
    2.捕捉按钮的状态,当单击时返回8.
    3.返回8时,取发言文本框的内容,然后处理,再写入发言文本框。
    4.向发送按钮发一个单击的消息。
    5.搞定。
      

  2.   

    感觉楼主是一个高人!
     look4sword(觅剑) 大侠:方不方便留个QQ,请教一下?
    我的QQ:75230034
    谢谢先!
      

  3.   

    呵呵,MY,说的一点也没错,但是我还得用。
    我这个东东不是做给QQ的,是公司用的RTX,内部QQ。
    我其实很菜嘀。QQ:112506861
      

  4.   

    我想看看你的捕捉窗口,追加按扭,到自动发送消息的原码,想研究一下,算是学习学习.能否方便,发到
    邮箱.
        [email protected]
      谢谢!
      

  5.   

    把我的关键代码拿出来,高手看到就指点一下,没弄过的可以借鉴一下:
    相关API请自行写上:'-------------------------------
    '腾讯通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
    LoopExit SubA:
    MsgBox "Sorry!有错误发生!", vbExclamation + vbSystemModal
    SendMessage ReHwnd, WM_SETTEXT, 0, ByVal "" '将内容清空,免得错误持续.
    End Sub
      

  6.   

    问你下,楼主
    你是如何得到QQ的句柄的??没看明白
    GetForegroundWindow是得到程序自身的句柄,你这里用他取QQ的句柄?不明白,
    请上来说说
      

  7.   

    不是QQ的句柄,是聊天对话框的句柄。而且我这不是QQ,是腾讯通RTX。'取得当前活动窗口的句柄
    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
    …………
      

  8.   

    你是通过定时检测的,但我认为你为自建的BUTTON写个WNDPROC来判断状态效率更高。
    当然为了能处理接收的数据,我想你是否可以为文本框也写个消息处理过程,不过我对RICHEDIT没试过,不知道与RTF格式是否有涉及。
    你的想法很好啊,很有启发。学习!
      

  9.   

    http://www.qqday.com/Article/qqmiji/fangfanjiqiao/200505/134.html
    里面说的很详细
    自己研究吧