WEBBROWSER中模拟鼠标点击(SendMessage/PostMessage)

时间:2021-07-09 03:52:35

好久没有写文章,发一篇顶顶博客访问量。别人建议转一些比较好的代码也贴过来,但是我打算这里主要发自己原创的代码,所以么。。流量该多少就多少吧。。。

回到主题,在webbrowser中点击某链接网上几乎都是用document对象模拟点击,这个方法基本能应对一般的情况,但是例如广告联盟的点击XXX就有检测机制(不多解释,你们懂的)。所以完全模拟鼠标的点击事件就比较完美。于是我用了最常见的SendMessage。

接下来就要解决一个问题,webbrowser的句柄问题。从控件本身得到的句柄不是真正的浏览窗口的句柄,用SPY++看一下就能看出来,这里不贴图了。按照这个窗体的结构,用以下代码可以获取到网页的窗口的句柄。
'获得webbrowser的句柄
Private Function GetBrowserWindow(hWnd As Long) As Long
    Dim lngHnd As Long
    lngHnd = FindWindowEx(hWnd, 0, "Shell Embedding", vbNullString) '
    lngHnd = FindWindowEx(lngHnd, 0, "Shell DocObject View", vbNullString)
    lngHnd = FindWindowEx(lngHnd, 0, "Internet Explorer_Server", vbNullString)
    GetBrowserWindow = lngHnd
End Function

然后就是网页元素的定位,向哪个坐标发送点击。这里用了DOM对象遍历来获取具体位置。都知道网页上一个元素有offsetLeft,offsetWidth,offsetHeight,offsetTop属性,但是都是相对容器来说的,所以可以通过遍历相加得到这个元素的绝对位置(这个绝对也是相对于网页浏览器窗口来说的。。)。于是代码如下:
Private Sub GetPos(objA As Object)
    On Error Resume Next
    adW = objA.offsetWidth
    adH = objA.offsetHeight
    adX = objA.offsetLeft
    adY = objA.offsetTop
    Set objA = objA.parentNode   '遍历结点 获取绝对位置
    Do While Not (objA Is Nothing)
        adX = adX + objA.offsetLeft
        adY = adY + objA.offsetTop
        Set objA = objA.parentNode
    Loop
    txtX.Text = CStr(adX)
    txtY.Text = CStr(adY)
    'Debug.Print "X:" & adX, "Y:" & adY, "W:" & adW, "H:" & adH, "P:" & adPos
End Sub

好了,主要的问题分析完毕,我不多说废话了,直接贴代码看吧。

'获得webbrowser的句柄
Private Function GetBrowserWindow(hWnd As Long) As Long
    Dim lngHnd As Long
    lngHnd = FindWindowEx(hWnd, 0, "Shell Embedding", vbNullString) '
    lngHnd = FindWindowEx(lngHnd, 0, "Shell DocObject View", vbNullString)
    lngHnd = FindWindowEx(lngHnd, 0, "Internet Explorer_Server", vbNullString)
    GetBrowserWindow = lngHnd
End Function

Private Function IsURL(objHTML As Object) As Boolean
    On Error Resume Next

Dim strHTML As String, strURL As String
    
    IsURL = False
    strURL = LCase$(txtHost.Text)
    strHTML = LCase$(objHTML.innerhtml)   '都转成小写
    
    If InStr(strHTML, strURL) > 0 Then IsURL = True  '是这个域名 返回true

End Function

Private Sub GetPos(objA As Object)
    On Error Resume Next

adW = objA.offsetWidth
    adH = objA.offsetHeight
    adX = objA.offsetLeft
    adY = objA.offsetTop
    Set objA = objA.parentNode   '遍历结点 获取绝对位置

Do While Not (objA Is Nothing)
        adX = adX + objA.offsetLeft
        adY = adY + objA.offsetTop
        Set objA = objA.parentNode
    Loop

txtX.Text = CStr(adX)
    txtY.Text = CStr(adY)
    'Debug.Print "X:" & adX, "Y:" & adY, "W:" & adW, "H:" & adH, "P:" & adPos
End Sub

''获取坐标按钮点击事件
Private Sub cmdGetXY_Click()
    On Error Resume Next

Dim objHTML As Object
    Dim i       As Integer
    
    If txtHost.Text = "" Then
        'MsgBox "不写域名,搞我呀。。。"
        Exit Sub
    End If

txtX.Text = ""
    txtY.Text = ""
    adX = 0
    adY = 0
    adW = 0
    adH = 0
    
    For i = 0 To 9
        Set objHTML = webB.Document.GetElementByID("bdfs" & CStr(i))

If Not (objHTML Is Nothing) Then
            If IsURL(objHTML) Then
                Set objHTML = webB.Document.GetElementByID("dfs" & CStr(i))
                adPos = 1   '右侧链接区
                Call GetPos(objHTML)
                Exit For
            End If
        End If

Set objHTML = webB.Document.GetElementByID("400" & CStr(i))

If Not (objHTML Is Nothing) Then
            If IsURL(objHTML) Then
                Set objHTML = webB.Document.GetElementByID("aw" & CStr(i - 1))
                adPos = 0
                Call GetPos(objHTML)
                Exit For
            End If
        End If

Set objHTML = webB.Document.GetElementByID("300" & CStr(i))

If Not (objHTML Is Nothing) Then
            If IsURL(objHTML) Then
                Set objHTML = webB.Document.GetElementByID("aw" & CStr(i - 1))
                adPos = 2
                Call GetPos(objHTML)
                Exit For
            End If
        End If

Next
    
    'If adX = 0 And adY = 0 Then MsgBox "没有找到。。。"
    
    Set objHTML = Nothing
    
End Sub

'''发送点击按钮点击事件
Private Sub cmdClick_Click()
    On Error Resume Next
    Dim x      As Long, y As Long
    Dim intRnd As Integer

Randomize   '启动随机数

If adX = 0 And adY = 0 Then
        'MsgBox "没有找到链接你也点。。。"
        Exit Sub
    End If
    
    wbHwnd = GetBrowserWindow(Me.hWnd)  '得到句柄

If adPos = 0 Then  '在搜索结果区的上面
        webB.Document.parentwindow.Scroll 0, adY - adH + 8  '修正下数据 正好对准
        x = 30 + Int((Rnd * adW) / 2)
        y = (Int((Rnd * adH) / 2) + 2) * &H10000
    ElseIf adPos = 1 Then '在右侧的推广链接区
        webB.Document.parentwindow.Scroll adX, adY - 11 '修正下数据
        x = 150 + Int((Rnd * adW) / 2)
        y = (Int((Rnd * adH) / 2) + 2) * &H10000
    ElseIf adPos = 2 Then '在搜索结果当中
        webB.Document.parentwindow.Scroll 0, adY - 11  '修正下数据
        x = 30 + Int((Rnd * adW) / 2)
        y = (Int((Rnd * adH) / 2) + 2) * &H10000
    End If
    
    'Debug.Print "Click:", x, y / &H10000
    PostMessage wbHwnd, WM_LBUTTONDOWN, 1&, x + y
    PostMessage wbHwnd, WM_LBUTTONUP, 1&, x + y
  
End Sub

有什么问题可以加我Q跟我讨论。

WEBBROWSER中模拟鼠标点击(SendMessage/PostMessage)的更多相关文章

  1. 使用powershell/vbs自动化模拟鼠标点击操作

    今天想做windows上的自动化,所以才有了模拟鼠标点击的需求,先考虑用powershell实现: 首先先安装一个名为“WASP”免费可用的Powershell扩展程序,下载地址:http://was ...

  2. 利用python模拟鼠标点击自动完成工作,提升你的工作效率!

    没有什么能比学以致用让学习变得更有动力的了. 不知道大家在工作中有没有一些工作需要重复的点击鼠标,因为会影响到财务统计报表的关系,我们每个月底月初都要修改ERP中的单据日期,单据多的时候光修改就能让你 ...

  3. C#实现模拟鼠标点击事件(点击桌面的其他程序 )

    注释感觉已经很清楚了,有不懂的欢迎评论 1 using System; using System.Collections.Generic; using System.ComponentModel; u ...

  4. (原)python中matplot中获得鼠标点击的位置及显示灰度图像

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6182474.html 参考网址: http://matplotlib.org/examples/pyl ...

  5. C#用mouse_event模拟鼠标点击的问题

    1.首先添加using System.Runtime.InteropServices; 2.为鼠标添加模拟点击的各种参数 //鼠标事件  因为我用的不多,所以其他参数没有写 1 2 3 4 5 6 7 ...

  6. jQuery模拟鼠标点击事件失效的问题

    最近使用jQuery操作浏览器获取数据,需要对分页的信息进行处理,发现直接使用$('div#pager a.next').click();的这种写法无法触发点击事件. 使用trigger('click ...

  7. Webbrowser中模拟连接点击(非鼠标模拟)

    Delphi uses mshtml, ActiveX; //初始加载网易主页 procedure TForm1.FormCreate(Sender: TObject); begin Webbrows ...

  8. 如何使用python来模拟鼠标点击(将通过实例自动化模拟在360浏览器中自动搜索"python")

    一.准备工作: 安装pywin32,后面开发需要pywin32的支持,否则无法完成与windows层面相关的操作. pywin32的具体安装及注意事项: 1.整体开发环境: 基于windows7操作系 ...

  9. Qt 模拟鼠标点击(QApplication::sendEvent(ui->pushbutton, &event0);)

    QPoint pos(0,0);QMouseEvent event0(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt ...

随机推荐

  1. ym—— Android网络框架Volley(体验篇)

    VolleyGoogle I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如: android-async-http retrofit okhttp ...

  2. phpcms 源码分析三:common.inc.php

    这次是逆雪寒分析common.inc.php的数据库部分: <?php // 包含数据库操作类,下章详说 require PHPCMS_ROOT.'/include/'.$db_file.'.c ...

  3. Angular2的模块架构浅谈

    引言angular2相比1引入了更完善的模块系统,回忆ng1的应用中通常在页面的html标签或body标签中添加ng-app节点,值为应用的模块名,整个应用都将围绕这个模块来展开,到了ng2,模块概念 ...

  4. 安装完jdk配置环境变量

    (1)新建->变量名"JAVA_HOME",变量值"C:\Java\jdk1.8.0_05"(即JDK的安装路径) (2)编辑->变量名" ...

  5. TableView的性能优化

    现在市场上的iOS应用程序界面中使用最多的UI控件是什么? 答案肯定是UITableView,几乎每一款App都有很多的界面是由UITableView实现的,所以为了做出一款优秀的App,让用户有更好 ...

  6. 从SQL Server CloudDBA 看云数据库智能化

    最近阿里云数据库SQL Server在控制台推出了CloudDBA服务,重点解决数据库性能优化领域问题,帮助客户更好的使用好RDS数据库,这是继MySQL之后第二个关系型数据库提供类似的服务.   数 ...

  7. RT-SA-2019-005 Cisco RV320 Command Injection Retrieval

    Advisory: Cisco RV320 Command Injection RedTeam Pentesting discovered a command injection vulnerabil ...

  8. &lbrack;转&rsqb;你可能不知道的五个强大HTML5 API

    一.全屏 // 找到适合浏览器的全屏方法 function launchFullScreen(element) { if(element.requestFullScreen) { element.re ...

  9. 德哥PostgreSQL学习资料汇总&lpar;转&rpar;

    文章来自:https://yq.aliyun.com/articles/59251?spm=5176.100239.bloglist.95.5S5P9S 德哥博客新地址:https://billtia ...

  10. 利用Jenkins未授权获取服务器权限--Docker还来干扰--一次渗透的经历

    Jenkins获取权限的过程 Jenkins存在未授权访问漏洞 Jenkins存在未授权访问漏洞,且项目具有读取权限,通过项目的日志获取到一个账号密码,尝试登录成功,打开控制台成功. 备注:控制台一般 ...