Option Explicit Private Const WM_CHAR = &H102 Private Const WM_LBUTTONDOWN = &H201 Private Const WM_LBUTTONUP = &H202Private 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 PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function GetFocus Lib "user32" () As Long '在TM2009、QQ2011下通过 Private Sub Command1_Click() Dim lngP As Long Dim lngTextHwnd As Long Dim lngEnterHwnd As Long '窗体句柄,经过试验也就是输入文本框的句柄,和SPY++的结果完全相符 lngTextHwnd = FindWindow("TXGuiFoundation", "qq名称")
End Sub '将一个字符串通过PostMessage传送出去 Private Sub subPostString(ByVal lngHandle As Long, ByVal strP As String) Dim intP As Integer Dim intK As Integer Dim lngAsc As Long Dim lngP As Long Dim strT As String On Error GoTo errSub For intP = 0 To Len(strP) - 1 strT = Mid(strP, intP + 1, 1) If Asc(strT) <= 0 Then lngAsc = AscW(StrConv(strT, 128)) If lngAsc < 0 Then lngAsc = lngAsc + 65536 '2^16 End If Else lngAsc = Asc(strT) End If lngP = PostMessage(lngHandle, WM_CHAR, lngAsc, 0) Next intP Exit Sub errSub:End Sub 这个代码可以把要发送的字符发送到qq消息文本框
Option Explicit
Private Const WM_CHAR = &H102
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202Private 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 PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GetFocus Lib "user32" () As Long
'在TM2009、QQ2011下通过
Private Sub Command1_Click()
Dim lngP As Long
Dim lngTextHwnd As Long
Dim lngEnterHwnd As Long
'窗体句柄,经过试验也就是输入文本框的句柄,和SPY++的结果完全相符
lngTextHwnd = FindWindow("TXGuiFoundation", "qq名称")
Call subPostString(lngTextHwnd, "ABC") '将字符串发送给输入文本框
End Sub
'将一个字符串通过PostMessage传送出去
Private Sub subPostString(ByVal lngHandle As Long, ByVal strP As String)
Dim intP As Integer
Dim intK As Integer
Dim lngAsc As Long
Dim lngP As Long
Dim strT As String
On Error GoTo errSub
For intP = 0 To Len(strP) - 1
strT = Mid(strP, intP + 1, 1)
If Asc(strT) <= 0 Then
lngAsc = AscW(StrConv(strT, 128))
If lngAsc < 0 Then
lngAsc = lngAsc + 65536 '2^16
End If
Else
lngAsc = Asc(strT)
End If
lngP = PostMessage(lngHandle, WM_CHAR, lngAsc, 0)
Next intP
Exit Sub
errSub:End Sub
这个代码可以把要发送的字符发送到qq消息文本框
2.考虑便于维护的技术方案,不会随qq变更而需要大作改动,类似以前版本的SaveMsg方案。3.支持后台聊天记录即不打开聊天窗口即可记录聊天记录。4.支持图片、表情、文件传输记录,可以显示为与消息管理器同样效果,即与你在QQ历史聊天记录里看到的是一样的效果(图文并茂)。
5.兼容32位64位。
6.商业代码,与技术代码有本质的区别,有经验的同行应该都了解,从技术到产品是有一段很长的距离的,我的代码一个dll一个api,封装完善,调用一下即可,完全傻瓜化。
7.稳定的框架和技术沉淀,代码从08年到现在已经经过了5年的沉淀。
8.支持注入方式和劫持方式两种方案。9.带有调试工具,Debug版本调试,Release版本自动隐藏调试,不必借用其它第三方插件或者工具来作二次开发,非常方便。10.兼容所有之前版本,支持2008~2013最新版所有版本,支持MSN。
花了一些时间,终于把QQ2013正式版beta1 7979版本的聊天记录搞定了,几经周折,来的不容易,总体来说还是比较满意的,对这个方案作一下总结:1.采用技术方案为hook方式,非不可靠的硬编码、非不负责任的读内存方式。
2.考虑便于维护的技术方案,不会随qq变更而需要大作改动,类似以前版本的SaveMsg方案。3.支持后台聊天记录即不打开聊天窗口即可记录聊天记录。4.支持图片、表情、文件传输记录,可以显示为与消息管理器同样效果,即与你在QQ历史聊天记录里看到的是一样的效果(图文并茂)。
5.兼容32位64位。
6.商业代码,与技术代码有本质的区别,有经验的同行应该都了解,从技术到产品是有一段很长的距离的,我的代码一个dll一个api,封装完善,调用一下即可,完全傻瓜化。
7.稳定的框架和技术沉淀,代码从08年到现在已经经过了5年的沉淀。
8.支持注入方式和劫持方式两种方案。9.带有调试工具,Debug版本调试,Release版本自动隐藏调试,不必借用其它第三方插件或者工具来作二次开发,非常方便。10.兼容所有之前版本,支持2008~2013最新版所有版本,支持MSN。
http://blog.csdn.net/nengx/article/details/11299533QQ627660966 以上所有楼层的技术我这里都有demo和源码,并且都封装为DLL供傻瓜化调用。