喝茶就不用了,还不如多加点分呢,呵呵 Dim QQWindowhWnd As Long, QQChildhWnd As Long, ClassName As String Dim RichEdit20AIndex As Long, QQRect As RECT QQWindowhWnd = FindWindow("#32770", "与 " & Text1.Text & " 交谈中") If QQWindowhWnd <> 0 Then '找到了目标窗口 QQChildhWnd = GetWindow(QQWindowhWnd, GW_CHILD) If QQChildhWnd <> 0 Then Do DoEvents ClassName = String(255, " ") GetClassName QQChildhWnd, ClassName, 255 ClassName = RTrim(ClassName) ClassName = Left(ClassName, Len(ClassName) - 1) If ClassName = "RichEdit20A" Then '找到的第一个类名为RichEdit20A就是 GetClientRect QQChildhWnd, QQRect Dim DesktophWnd As Long, DesktophDC As Long, SysColor As Long Dim GdiDC As Long, GdiBitmap As Long, DefaultOject As Long, QQDC As Long Dim BitmapWidth As Long, BitmapHeight As Long DesktophWnd = GetDesktopWindow DesktophDC = GetWindowDC(DesktophWnd) SysColor = GetDeviceCaps(DesktophDC, 12) GdiDC = CreateCompatibleDC(0) If GdiDC = 0 Then MsgBox "创建GDI设备失败!", 64, "错误" Exit Sub End If BitmapWidth = QQRect.Right - QQRect.Left BitmapHeight = QQRect.Bottom - QQRect.Top GdiBitmap = CreateBitmap(BitmapWidth, BitmapHeight, 1, SysColor, ByVal 0&) If GdiBitmap = 0 Then DeleteDC GdiDC MsgBox "创建GDI位图失败!", 64, "错误" Exit Sub End If DefaultOject = SelectObject(GdiDC, GdiBitmap) QQDC = GetWindowDC(QQChildhWnd) BitBlt GdiDC, 0, 0, BitmapWidth, BitmapHeight, QQDC, QQRect.Left, QQRect.Top, vbSrcCopy '开始进行识别操作,已经得到了图片就是安造我上面所说的方法识别就可以了 ...
'为用完的GDI做清理 SelectObject GdiDC, DefaultOject DeleteObject GdiBitmap DeleteDC GdiDC Exit Do End If QQChildhWnd = GetWindow(QQChildhWnd, GW_HWNDNEXT) Loop While QQChildhWnd <> 0 End If End If
然后根据句柄可以取得窗口里所有的子窗口句柄(包括显示聊天信息的控件句柄)。
根据子窗口句柄可以得到子窗口的类名和窗口标题,
根据类名和窗口标题去识别哪一个窗口句柄是显示聊天信息的控件。
然后根据这个子窗口的句柄取得子窗口的客户区域在屏幕的位置和大小
然后将窗口抓图,然后分析图片,认出“接受”在屏幕上的位置(这样要用到AI)
然后触发鼠标事件点击那个区域。
但是这个“然后将窗口抓图,然后分析图片,认出“接受”在屏幕上的位置(这样要用到AI) ”这个不好办啊
现在是句柄知道了,就是那个窗口不是IE窗口,一次不知怎么才能得到那个“接受”的链接,或者说不知怎么才能“点击”那个“接受”继续请教!
但怎么看都是在写病毒,呵呵
===我使用spy++得到的是“接受”、“取消”所在的那个大框框的句柄,ClassName是“AfxWnd42”,caption是""(空),这个子窗口下面还有个ClassName是MCIWndClass,caption是""(空)的子窗口
但是那个“接受”、“取消”就没有办法使用代码点击,请问怎么办?
btw:上面2个哥们说什么病毒,莫名其妙,你怎么就判断是病毒呢?这个只是我们一个系统想使用qq做中介管理不同地点的分支机构电脑进行下载或者管理。你没有说对,不好意思了不过还是谢谢帮我顶贴。
对VB也要很了解,不然是搞不出“vb病毒”的。他在VB版发帖问这种问题,就说明了他想用VB来做这个事。
而VB的运行是基于运行库的,虽然也可以在多数系统上,不用安装就可以执行无控件的VB程序,但真想做
成“病毒”还真的不容易。还有,这个需求还是基于能上网QQ(对方已经登陆的),目的只是使用QQ的远
程控制功能。这样的需求大不了算个后门程序,怎么也算不上“病毒”。
还有,已经实现了这个远程控制的程序很多,比如radmin、PCAnywhere、冰河等软件都可以进行远程主
机的控制,使用QQ反而麻烦。还要让对方启动QQ,输入账号密码登陆后才能去申请控制。还要自己编个程
序再对方主机先运行好了等着这个请求,还要等对方打开QQ聊天窗口才能去操作,搞不好还有用到AI技术
(人工智能技术)来做处理。看着就累,呵呵。不过QQ的远程控制是P2P的,到是比那些给服务器用的优
秀点,呵呵
http://topic.csdn.net/u/20070602/14/b1746629-d4c8-4e55-875e-71fa46d0e288.html
因为你要识别出来的应该只是几个中文字,应该更加简单
一个是显示当前聊天信息的,一个是输入回复信息的,还有一个是显示聊天纪录的
主要识别就是下面的东西,应该不难,就专门作这几个字的识别码就可以了
请选择接受 还是 取消
注意:下划线部分是识别的关键
Dim RichEdit20AIndex As Long, QQRect As RECT
QQWindowhWnd = FindWindow("#32770", "与 " & Text1.Text & " 交谈中")
If QQWindowhWnd <> 0 Then
'找到了目标窗口
QQChildhWnd = GetWindow(QQWindowhWnd, GW_CHILD)
If QQChildhWnd <> 0 Then
Do
DoEvents
ClassName = String(255, " ")
GetClassName QQChildhWnd, ClassName, 255
ClassName = RTrim(ClassName)
ClassName = Left(ClassName, Len(ClassName) - 1)
If ClassName = "RichEdit20A" Then
'找到的第一个类名为RichEdit20A就是
GetClientRect QQChildhWnd, QQRect
Dim DesktophWnd As Long, DesktophDC As Long, SysColor As Long
Dim GdiDC As Long, GdiBitmap As Long, DefaultOject As Long, QQDC As Long
Dim BitmapWidth As Long, BitmapHeight As Long
DesktophWnd = GetDesktopWindow
DesktophDC = GetWindowDC(DesktophWnd)
SysColor = GetDeviceCaps(DesktophDC, 12)
GdiDC = CreateCompatibleDC(0)
If GdiDC = 0 Then
MsgBox "创建GDI设备失败!", 64, "错误"
Exit Sub
End If
BitmapWidth = QQRect.Right - QQRect.Left
BitmapHeight = QQRect.Bottom - QQRect.Top
GdiBitmap = CreateBitmap(BitmapWidth, BitmapHeight, 1, SysColor, ByVal 0&)
If GdiBitmap = 0 Then
DeleteDC GdiDC
MsgBox "创建GDI位图失败!", 64, "错误"
Exit Sub
End If
DefaultOject = SelectObject(GdiDC, GdiBitmap)
QQDC = GetWindowDC(QQChildhWnd)
BitBlt GdiDC, 0, 0, BitmapWidth, BitmapHeight, QQDC, QQRect.Left, QQRect.Top, vbSrcCopy
'开始进行识别操作,已经得到了图片就是安造我上面所说的方法识别就可以了
...
'为用完的GDI做清理
SelectObject GdiDC, DefaultOject
DeleteObject GdiBitmap
DeleteDC GdiDC
Exit Do
End If
QQChildhWnd = GetWindow(QQChildhWnd, GW_HWNDNEXT)
Loop While QQChildhWnd <> 0 End If
End If
在夜深人静时,对这个搞得我头昏的问题进行解答,真的感动!
我会加分,200分吧
至于喝茶钱,最好将账号发给我:137 278 59 861
不想说了却不给。
现在这个东东还有2个地方不明白:
1:我使用SPY++看到那个qq收到远程协助时,显示“接受”“取消”的窗口类名是AfxWnd42,标题为空,却不是"RichEdit20A","RichEdit20A"是下面发信息的窗口,不是接受窗口,接受窗口才显示“接受”“取消”
请问是怎么回事呢?2:现在代码我看了后面好像只是取得窗口图片,但是还没有说触发鼠标怎么点击那个“接受”或者“取消”呢?
能不能百忙中帮完善一下?谢谢先!再一次感谢!
而且我的QQ是2008版,更新到了最新版本。我看到的窗口类名就是 "#32770"
而且通过
QQWindowhWnd = FindWindow("#32770", "与 " & Text1.Text & " 交谈中")
Text1.Text 是对方名称,如:“与 Supermanking 交谈中”我能成功的取得QQ聊天窗口的句柄并也能取得显示“接受”出现的窗口句柄,
也成功的抓到了图片,只是没有作识别操作而已。要作识别就要建一个特征代码库,起码要做这几个字的特征代码,
再循环搜索前,最好好要对图像进行处理,如灰度处理,提高对比度处理等。
然后再轮循对比特征特征库。如果都能对比上,那就是那个区域了,模拟鼠标去点就对了。技术除了问和学,还要靠自己研究和理解的。主要是你这种识别没什么价值,其实你这个需求的AI对技术是没什么要求的,全是基本语句。
就是工作量多,唯一的要求就是逻辑思维需要清晰,这点上我都和你讲得很清楚了,
所以还是你自己做识别吧。