C# 根据鼠标坐标取网页内成员坐标.ie

有时候你需要后台获取ie浏览器 鼠标所在位置的元素坐标,然而你使用屏幕坐标是不可行的

所以我们需要把坐标转换成浏览器内坐标 然后再通过elementFromPoint获取网页成员。

        private void tmrWatcher_Tick(object sender, EventArgs e)
{
IntPtr hWnd = WindowFromPoint(MousePosition);
dynamic document = GetHtmlDocumentByHandle(hWnd);
if (document != null)
{
Rectangle r = GetHtmlElementPoint(hWnd, MousePosition, document); // 根据鼠标坐标取网页成员坐标
Marshal.FinalReleaseComObject(document);
Console.WriteLine(r.X + ":" + r.Y + ":" + r.Width + ":" + r.Height);
}
}

上面是一个时钟tmrWatcher的Tick回调函数,在上面使用了WindowFromPoint函数 主要是获取

MousePosition所在的窗口句柄,然后再通过GetHtmlDocumentByHandle函数(获取文档从句柄)

        public static object GetComObjectByHandle(int Msg, Guid riid, IntPtr hWnd)
{
object _ComObject;
int lpdwResult = 0;
if (!SendMessageTimeout(hWnd, Msg, 0, 0, SMTO_ABORTIFHUNG, 1000, ref lpdwResult))
return null;
if (ObjectFromLresult(lpdwResult, ref riid, 0, out _ComObject))
return null;
return _ComObject;
} public object GetHtmlDocumentByHandle(IntPtr hWnd)
{
string buffer = new string('\0', 24);
GetClassName(hWnd, ref buffer, 25);
if (buffer != "Internet Explorer_Server")
return null;
return GetComObjectByHandle(WM_HTML_GETOBJECT, IID_IHTMLDocument, hWnd);
}

实际上与我上次的帖子:http://blog.csdn.net/u012395622/article/details/46404193

并没什么太大的出入,而获取一个网页文档的成员只是简单的调度Mshtml COM接口

        public Rectangle GetHtmlElementPoint(IntPtr hWnd, Point point, dynamic document)
{
if (document == null && hWnd != IntPtr.Zero)
return Rectangle.Empty;
ScreenToClient(hWnd, ref point);
dynamic element = document.elementFromPoint(point.X, point.Y);
if (element == null) return Rectangle.Empty;
try
{
Rectangle o = new Rectangle()
{
Y = element.offsetTop,
X = element.offsetLeft,
Width = element.offsetWidth,
Height = element.offsetHeight
};
while (element.offsetParent != null)
{
element = element.offsetParent;
o.Y += element.offsetTop;
o.X += element.offsetLeft;
}
return o;
}
catch
{
return Rectangle.Empty;
}
}

上面代码是实现获取 元素在网页内的一个确切坐标,整体并不是很难阅读的。

之所以while(element.offsetParent != null) { ... }是因为网页始终与客户端不相

同我们不能用常规在Win32操作控件位置那样去看待它 它很麻烦,而且层次

很难分明,所以会造成你根本不知道到底有多宽不过还好,一般计算一个

成员元素在窗口什么位置,只要把父容器的位置加起来就行了。反正有点

解释的不清楚,大家莫见怪

        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool ScreenToClient(IntPtr hWnd, ref Point lpPoint); [DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetClassName(
[In]IntPtr hWnd,
[MarshalAs(UnmanagedType.VBByRefStr)]ref string IpClassName,
[In]int nMaxCount
); [DllImport("oleacc.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ObjectFromLresult(
[In]int lResult,
[In]ref Guid riid,
[In]int wParam,
[Out, MarshalAs(UnmanagedType.IUnknown)]out object ppvObject
); [DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.I4)]
public static extern int RegisterWindowMessage(
[In]string lpString
); [DllImport("user32.dll", EntryPoint = "SendMessageTimeoutA", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SendMessageTimeout(
[In]IntPtr MSG,
[In]int hWnd,
[In]int wParam,
[In]int lParam,
[In]int fuFlags,
[In]int uTimeout,
[In, Out]ref int lpdwResult
); [DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.SysInt)]
public static extern IntPtr WindowFromPoint(
[In]Point Point
); public const int SMTO_ABORTIFHUNG = 2; public readonly static int WM_HTML_GETOBJECT = RegisterWindowMessage("WM_HTML_GETOBJECT");
public readonly static Guid IID_IHTMLDocument = new Guid("626fc520-a41e-11cf-a731-00a0c9082637");

C# 依据鼠标坐标取网页内成员坐标.ie的更多相关文章

  1. Python3爬虫----爬取网页内的图片

    无聊把公司内网爬了一遍. https://github.com/gig886/Python/tree/master/爬虫

  2. python 爬取网页内的代理服务器列表(需调整优化)

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-08-30 20:38:23 # @Author : EnderZhou (z ...

  3. 利用Python爬取网页图片

    最近几天,研究了一下一直很好奇的爬虫算法.这里写一下最近几天的点点心得.下面进入正文: 你可能需要的工作环境: Python 3.6官网下载 我们这里以sogou作为爬取的对象. 首先我们进入搜狗图片 ...

  4. [转载]爬虫的自我解剖(抓取网页HtmlUnit)

    网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,4行代码就OK啦,例子如下: 1 2 3 4 final WebClient webClie ...

  5. [python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】

    [python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pytho ...

  6. HTML-图片热点、网页内嵌、网页拼接、快速切图

    图片热点 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果.与图片链接不同,热点是图片上的某一个区域或多个区域. 我们用魔兽世界图片来做一个图片热点,点击logo.区域和不 ...

  7. 爬虫的自我解剖(抓取网页HtmlUnit)

    网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源`HtmlUnit`包,4行代码就OK啦,例子如下: final WebClient webClient=new ...

  8. python分布式抓取网页

    呵呵,前两节好像和python没多大关系..这节完全是贴代码, 这是我第一次写python,很多地方比较乱,主要就看看逻辑流程吧. 对于编码格式确实搞得我头大..取下来页面不知道是什么编码,所以先找c ...

  9. HTML5绘制矩形和圆形并且还有获取在这个图层内的坐标的思路和代码 - feilong_12的专栏 - 博客频道 - CSDN.NET

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

随机推荐

  1. ubuntu16 下安装redis 以及设置其为开机启动

    1.下载redis安装包 sudo wget http://download.redis.io/releases/redis-3.2.6.tar.gz 2.解压 tar -zxvf  redis-3. ...

  2. android(2)——Structure of an Android Application

    1 structure of an android application An Android application is primarily made up of three pieces: t ...

  3. C# Razor 小笔记和某些细节

    知识小结:C# 的主要 Razor 语法规则 单独一个变量直接使用 @a 的形式,无需加分号,一般是直接使用已有变量,注意在使用 html 标签时,要和 razor 表达式加一个空格. //不能有空格 ...

  4. DRAM(动态)存储器

    一.DRAM的存储元电路 常见的DRAM存储元电路有四管式和单管式两种,它们的共同特点是靠电容存储电荷的原理来存储信息.电容上存有足够多的电荷表示“1”,电容上无电荷表示“0”. 由于电容存储的电荷会 ...

  5. December 14th 2016 Week 51st Wednesday

    Everything has its time and that time must be watched. 万物皆有时,时来不可失. Everything has its time, and I r ...

  6. Ubuntu apt-get 更换源

    Ubuntu apt-get 更换源 我们使用清华的镜像源进行更换 Ubuntu 的软件源配置文件是 /etc/apt/sources.list.将系统自带的该文件做个备份,将该文件替换为下面内容,即 ...

  7. 使用Java语言开发机器学习框架和参数服务器

    https://github.com/wudikua/ps 本项目是我自己动手实现的机器学习训练框架,代码简单,有很多不完善,但是也保留了最小可用功能 通过自己编写这个项目,可以帮助自己入门机器学习 ...

  8. 启动bash shell的三种方式下,检查的启动文件

    启动bash shell的三种方式 1.登录时当做默认登录shell 2.作为非登录shell的交互式shell 3.作为运行脚本的非交互shell 一.登录shell 登录Linux系统时,bash ...

  9. java中JVM的原理重温【转】

    一.基础理论知识 1.java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上 ...

  10. keepalived.md

    配置文件说明 global_defs区域 global_defs { notification_email { acassen@firewall.loc failover@firewall.loc s ...