向qq聊天窗口的文本框写入字符的方法解决方案
向qq聊天窗口的文本框写入字符的方法
由于以前qq消息尾巴病毒的流行,腾讯使用了一些技术,使得现在的qq聊天窗口屏蔽了wm_settext消息
这样的话,要利用程序自动向qq聊天窗口发送文本就比较难了。不过经过测试发现,wm_char消息没有被qq屏蔽。因此,可以使用这个消息把字符发送到聊天窗口。不过要注意的是,发送中文的话,要发送2次,也就是高低2个字节,不然会乱码的。
Declare Function SendMessage Lib "user32 " Alias "SendMessageA " (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
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
Declare Function GetWindowText Lib "user32 " Alias "GetWindowTextA " (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function PostMessage Lib "user32 " Alias "PostMessageA " (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function SetWindowText Lib "user32 " Alias "SetWindowTextA " (ByVal hwnd As Long, ByVal lpString As String) As Long
Public Const WM_CHAR = &H102
Public Const WM_SETTEXT = &HC
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const BM_CLICK = &HF5
Public Const WM_GETTEXT = &HD
Sub setQQText(ByVal fhwnd As Long, ByVal mystr As String)
' 向聊天窗口的文本框写入消息。fhwnd 是那个文本框的句柄,mystr 是你要写入的消息
Dim mydata() As Byte, i As Long, tmp_k As Long
i = 0
mydata = StrConv(mystr, vbFromUnicode)
tmp_k = UBound(mydata)
While i <= tmp_k
If mydata(i) < 128 Then
PostMessage fhwnd, WM_CHAR, mydata(i), 0&
i = i + 1
Else
PostMessage fhwnd, WM_CHAR, mydata(i), 0&
PostMessage fhwnd, WM_CHAR, mydata(i + 1), 0&
i = i + 2
End If
Wend
End Sub
顺便再附上几段代码,是关于如何找到qq那个文本框的句柄的。
Function MyFindWindowEx(wname As String, fhwnd As Long, temphnd As Long) As Long
Dim mystr As String * 255
由于以前qq消息尾巴病毒的流行,腾讯使用了一些技术,使得现在的qq聊天窗口屏蔽了wm_settext消息
这样的话,要利用程序自动向qq聊天窗口发送文本就比较难了。不过经过测试发现,wm_char消息没有被qq屏蔽。因此,可以使用这个消息把字符发送到聊天窗口。不过要注意的是,发送中文的话,要发送2次,也就是高低2个字节,不然会乱码的。
Declare Function SendMessage Lib "user32 " Alias "SendMessageA " (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
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
Declare Function GetWindowText Lib "user32 " Alias "GetWindowTextA " (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function PostMessage Lib "user32 " Alias "PostMessageA " (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function SetWindowText Lib "user32 " Alias "SetWindowTextA " (ByVal hwnd As Long, ByVal lpString As String) As Long
Public Const WM_CHAR = &H102
Public Const WM_SETTEXT = &HC
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const BM_CLICK = &HF5
Public Const WM_GETTEXT = &HD
Sub setQQText(ByVal fhwnd As Long, ByVal mystr As String)
' 向聊天窗口的文本框写入消息。fhwnd 是那个文本框的句柄,mystr 是你要写入的消息
Dim mydata() As Byte, i As Long, tmp_k As Long
i = 0
mydata = StrConv(mystr, vbFromUnicode)
tmp_k = UBound(mydata)
While i <= tmp_k
If mydata(i) < 128 Then
PostMessage fhwnd, WM_CHAR, mydata(i), 0&
i = i + 1
Else
PostMessage fhwnd, WM_CHAR, mydata(i), 0&
PostMessage fhwnd, WM_CHAR, mydata(i + 1), 0&
i = i + 2
End If
Wend
End Sub
顺便再附上几段代码,是关于如何找到qq那个文本框的句柄的。
Function MyFindWindowEx(wname As String, fhwnd As Long, temphnd As Long) As Long
Dim mystr As String * 255