基本信息
源码名称:IE下获取XPATH小工具源码(支持32/64位)
源码大小:0.21M
文件格式:.zip
开发语言:C#
更新时间:2019-11-06
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559

本次赞助数额为: 2 元 
   源码介绍



using commonlib.winapi;
using IEXPath.Properties;
using Microsoft.CSharp.RuntimeBinder;
using mshtml;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Windows.Forms;

namespace IEXPath
{
	public class frmIEXPath : Form
	{
		[CompilerGenerated]
		private static class <calculate>o__SiteContainer0
		{
			public static CallSite<Func<CallSite, object, IHTMLElementCollection>> <>p__Site1;

			public static CallSite<Func<CallSite, object, IHTMLElement>> <>p__Site2;
		}

		[CompilerGenerated]
		private static class <getElementAttribute>o__SiteContainer3
		{
			public static CallSite<Func<CallSite, object, string>> <>p__Site4;

			public static CallSite<Func<CallSite, object, string, object>> <>p__Site5;
		}

		private const string _VERSION = "1.0";

		public int hotkeyId;

		private Cursor moveCursor;

		private IHTMLElement lastEle;

		private char SPLIT = '"';

		private IContainer components;

		private GroupBox groupBox1;

		private TextBox txtOuterHtml;

		private Label label7;

		private TextBox txtText;

		private Label label6;

		private TextBox txtHTML;

		private Label label5;

		private TextBox txtClass;

		private Label label4;

		private TextBox txtName;

		private Label label3;

		private TextBox txtID;

		private Label label2;

		private Label label1;

		private ListBox lstXPath;

		private PictureBox pictureBox1;

		private LinkLabel linkLabel1;

		private Timer timer1;

		private TextBox txtTag;

		private Label labletag;

		private CheckBox chkCopy;

		private CheckBox chkSplit;

		public frmIEXPath()
		{
			this.InitializeComponent();
		}

		protected override void WndProc(ref Message m)
		{
			if (m.Msg == 786 && m.WParam.ToInt32() == this.hotkeyId)
			{
				this.captureIE();
			}
			base.WndProc(ref m);
		}

		private void frmIEXPath_Load(object sender, EventArgs e)
		{
			this.Text = "IEXPath - 1.0";
			this.moveCursor = new Cursor(new MemoryStream(Resources.pen_r));
			Win32API.SetWindowPos(base.Handle, -1, 0, 0, 0, 0, 3);
			if (!Win32API.RegisterHotKey(base.Handle, this.hotkeyId, Win32API.KeyModifiers.None, Keys.F8))
			{
				MessageBox.Show("热键注册失败");
			}
		}

		private void frmIEXPath_FormClosed(object sender, FormClosedEventArgs e)
		{
			Win32API.UnregisterHotKey(base.Handle, this.hotkeyId);
		}

		private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
		{
			Process.Start("https://github.com/xwjie/IEXPath");
		}

		public static object GetComObjectByHandle(int Msg, Guid riid, IntPtr hWnd)
		{
			int lResult = 0;
			if (!Win32API.SendMessageTimeout(hWnd, Msg, 0, 0, 2, 1000, ref lResult))
			{
				return null;
			}
			object result;
			if (Win32API.ObjectFromLresult(lResult, ref riid, 0, out result))
			{
				return null;
			}
			return result;
		}

		public object GetHtmlDocumentByHandle(IntPtr hWnd)
		{
			string a = new string('\0', 24);
			Win32API.GetClassName(hWnd, ref a, 25);
			if (a != "Internet Explorer_Server")
			{
				return null;
			}
			return frmIEXPath.GetComObjectByHandle(Win32API.WM_HTML_GETOBJECT, Win32API.IID_IHTMLDocument, hWnd);
		}

		private void timer1_Tick(object sender, EventArgs e)
		{
			this.captureIE();
		}

		private void captureIE()
		{
			try
			{
				IntPtr hWnd = Win32API.WindowFromPoint(Control.MousePosition);
				IHTMLDocument2 iHTMLDocument = (IHTMLDocument2)this.GetHtmlDocumentByHandle(hWnd);
				if (iHTMLDocument != null)
				{
					Point mousePosition = Control.MousePosition;
					Win32API.ScreenToClient(hWnd, ref mousePosition);
					IHTMLElement e = iHTMLDocument.elementFromPoint(mousePosition.X, mousePosition.Y);
					this.readIEElement(e);
				}
			}
			catch (Exception ex)
			{
				MessageBox.Show("发生了一些错误:"   ex.Message);
			}
		}

		private void readIEElement(IHTMLElement e)
		{
			if (this.lastEle == e)
			{
				return;
			}
			this.clearBorderHint();
			this.lastEle = e;
			if (e == null)
			{
				return;
			}
			e.style.setAttribute("outline", "2px solid red", 1);
			this.txtID.Text = e.id;
			this.txtName.Text = this.getElementAttribute(e, "NAME");
			this.txtTag.Text = e.tagName;
			this.txtText.Text = this.getElementAttribute(e, "VALUE");
			this.txtClass.Text = e.className;
			this.txtHTML.Text = e.innerHTML;
			this.txtOuterHtml.Text = e.outerHTML;
			this.extractXPath(e);
		}

		private void extractXPath(IHTMLElement e)
		{
			this.lstXPath.Items.Clear();
			if (e.id != null)
			{
				this.addXPath(string.Concat(new object[]
				{
					"//*[@id=",
					this.SPLIT,
					e.id,
					this.SPLIT,
					"]"
				}));
				return;
			}
			this.addXPath(this.getXPathEx(e));
			string elementAttribute = this.getElementAttribute(e, "NAME");
			if (elementAttribute != "")
			{
				this.addXPath(string.Concat(new object[]
				{
					"//",
					e.tagName,
					"[@name=",
					this.SPLIT,
					elementAttribute,
					this.SPLIT,
					"]"
				}));
			}
			if (e.className != null)
			{
				this.addXPath(string.Concat(new object[]
				{
					"//",
					e.tagName,
					"[@class=",
					this.SPLIT,
					e.className,
					this.SPLIT,
					"]"
				}));
			}
			if (this.chkCopy.Checked)
			{
				Clipboard.SetText(this.lstXPath.Items[0].ToString());
			}
		}

		private string getXPathEx(IHTMLElement e)
		{
			IHTMLElement iHTMLElement = e;
			string text = "";
			while (iHTMLElement != null)
			{
				if (iHTMLElement.id != null)
				{
					text = string.Concat(new object[]
					{
						"//*[@id=",
						this.SPLIT,
						iHTMLElement.id,
						this.SPLIT,
						"]",
						text
					});
					break;
				}
				string str = this.extractCurrentXpath(iHTMLElement);
				text = str   text;
				iHTMLElement = iHTMLElement.parentElement;
			}
			return text;
		}

		private string extractCurrentXpath(IHTMLElement current)
		{
			string text = "/"   current.tagName;
			int num = this.calculate(current);
			if (num >= 1)
			{
				object obj = text;
				text = string.Concat(new object[]
				{
					obj,
					"[",
					num,
					"]"
				});
			}
			return text;
		}

		private int calculate(IHTMLElement current)
		{
			if (current.parentElement == null)
			{
				return 0;
			}
			if (frmIEXPath.<calculate>o__SiteContainer0.<>p__Site1 == null)
			{
				frmIEXPath.<calculate>o__SiteContainer0.<>p__Site1 = CallSite<Func<CallSite, object, IHTMLElementCollection>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.Convert(CSharpBinderFlags.ConvertExplicit, typeof(IHTMLElementCollection), typeof(frmIEXPath)));
			}
			IHTMLElementCollection iHTMLElementCollection = frmIEXPath.<calculate>o__SiteContainer0.<>p__Site1.Target(frmIEXPath.<calculate>o__SiteContainer0.<>p__Site1, current.parentElement.children);
			int length = iHTMLElementCollection.length;
			int result = 0;
			int num = 0;
			for (int i = 0; i < length; i  )
			{
				if (frmIEXPath.<calculate>o__SiteContainer0.<>p__Site2 == null)
				{
					frmIEXPath.<calculate>o__SiteContainer0.<>p__Site2 = CallSite<Func<CallSite, object, IHTMLElement>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.Convert(CSharpBinderFlags.None, typeof(IHTMLElement), typeof(frmIEXPath)));
				}
				IHTMLElement iHTMLElement = frmIEXPath.<calculate>o__SiteContainer0.<>p__Site2.Target(frmIEXPath.<calculate>o__SiteContainer0.<>p__Site2, iHTMLElementCollection.item(i, Missing.Value));
				if (iHTMLElement == null)
				{
					break;
				}
				if (iHTMLElement.tagName == current.tagName)
				{
					num  ;
					if (iHTMLElement == current)
					{
						result = num;
					}
				}
			}
			if (num == 1)
			{
				return 0;
			}
			return result;
		}

		private void addXPath(string str)
		{
			this.lstXPath.Items.Add(str);
		}

		private string getElementAttribute(IHTMLElement e, string name)
		{
			object attribute = e.getAttribute(name, 0);
			if (frmIEXPath.<getElementAttribute>o__SiteContainer3.<>p__Site4 == null)
			{
				frmIEXPath.<getElementAttribute>o__SiteContainer3.<>p__Site4 = CallSite<Func<CallSite, object, string>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.Convert(CSharpBinderFlags.None, typeof(string), typeof(frmIEXPath)));
			}
			Func<CallSite, object, string> arg_AA_0 = frmIEXPath.<getElementAttribute>o__SiteContainer3.<>p__Site4.Target;
			CallSite arg_AA_1 = frmIEXPath.<getElementAttribute>o__SiteContainer3.<>p__Site4;
			object arg_AA_2;
			if (!(attribute is DBNull))
			{
				if (frmIEXPath.<getElementAttribute>o__SiteContainer3.<>p__Site5 == null)
				{
					frmIEXPath.<getElementAttribute>o__SiteContainer3.<>p__Site5 = CallSite<Func<CallSite, object, string, object>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.BinaryOperation(CSharpBinderFlags.None, ExpressionType.Add, typeof(frmIEXPath), new CSharpArgumentInfo[]
					{
						CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
						CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType | CSharpArgumentInfoFlags.Constant, null)
					}));
				}
				arg_AA_2 = frmIEXPath.<getElementAttribute>o__SiteContainer3.<>p__Site5.Target(frmIEXPath.<getElementAttribute>o__SiteContainer3.<>p__Site5, attribute, "");
			}
			else
			{
				arg_AA_2 = "";
			}
			return arg_AA_0(arg_AA_1, arg_AA_2);
		}

		private void chkSplit_CheckedChanged(object sender, EventArgs e)
		{
			this.SPLIT = (this.chkSplit.Checked ? '\'' : '"');
		}

		private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
		{
			this.timer1.Enabled = true;
			this.Cursor = this.moveCursor;
		}

		private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
		{
			this.timer1.Enabled = false;
			this.Cursor = Cursors.Default;
			this.clearBorderHint();
		}

		private void clearBorderHint()
		{
			if (this.lastEle != null)
			{
				try
				{
					this.lastEle.style.setAttribute("outline", "", 1);
				}
				catch
				{
				}
			}
		}

		private void txtID_DoubleClick(object sender, EventArgs e)
		{
			TextBox textBox = (TextBox)sender;
			Clipboard.SetText(textBox.Text);
		}

		private void lstXPath_DoubleClick(object sender, EventArgs e)
		{
			if (this.lstXPath.SelectedIndex == -1)
			{
				return;
			}
			Clipboard.SetText(this.lstXPath.SelectedItem.ToString());
		}

		protected override void Dispose(bool disposing)
		{
			if (disposing && this.components != null)
			{
				this.components.Dispose();
			}
			base.Dispose(disposing);
		}

		private void InitializeComponent()
		{
			this.components = new Container();
			ComponentResourceManager componentResourceManager = new ComponentResourceManager(typeof(frmIEXPath));
			this.groupBox1 = new GroupBox();
			this.txtTag = new TextBox();
			this.labletag = new Label();
			this.txtOuterHtml = new TextBox();
			this.label7 = new Label();
			this.txtText = new TextBox();
			this.label6 = new Label();
			this.txtHTML = new TextBox();
			this.label5 = new Label();
			this.txtClass = new TextBox();
			this.label4 = new Label();
			this.txtName = new TextBox();
			this.label3 = new Label();
			this.txtID = new TextBox();
			this.label2 = new Label();
			this.label1 = new Label();
			this.lstXPath = new ListBox();
			this.linkLabel1 = new LinkLabel();
			this.timer1 = new Timer(this.components);
			this.chkCopy = new CheckBox();
			this.chkSplit = new CheckBox();
			this.pictureBox1 = new PictureBox();
			this.groupBox1.SuspendLayout();
			((ISupportInitialize)this.pictureBox1).BeginInit();
			base.SuspendLayout();
			this.groupBox1.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);
			this.groupBox1.Controls.Add(this.txtTag);
			this.groupBox1.Controls.Add(this.labletag);
			this.groupBox1.Controls.Add(this.txtOuterHtml);
			this.groupBox1.Controls.Add(this.label7);
			this.groupBox1.Controls.Add(this.txtText);
			this.groupBox1.Controls.Add(this.label6);
			this.groupBox1.Controls.Add(this.txtHTML);
			this.groupBox1.Controls.Add(this.label5);
			this.groupBox1.Controls.Add(this.txtClass);
			this.groupBox1.Controls.Add(this.label4);
			this.groupBox1.Controls.Add(this.txtName);
			this.groupBox1.Controls.Add(this.label3);
			this.groupBox1.Controls.Add(this.txtID);
			this.groupBox1.Controls.Add(this.label2);
			this.groupBox1.Location = new Point(12, 10);
			this.groupBox1.Name = "groupBox1";
			this.groupBox1.Size = new Size(325, 206);
			this.groupBox1.TabIndex = 0;
			this.groupBox1.TabStop = false;
			this.txtTag.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);
			this.txtTag.Location = new Point(68, 71);
			this.txtTag.Name = "txtTag";
			this.txtTag.Size = new Size(251, 21);
			this.txtTag.TabIndex = 5;
			this.txtTag.DoubleClick  = new EventHandler(this.txtID_DoubleClick);
			this.labletag.AutoSize = true;
			this.labletag.Location = new Point(39, 80);
			this.labletag.Name = "labletag";
			this.labletag.Size = new Size(23, 12);
			this.labletag.TabIndex = 12;
			this.labletag.Text = "Tag";
			this.txtOuterHtml.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);
			this.txtOuterHtml.Location = new Point(68, 179);
			this.txtOuterHtml.Name = "txtOuterHtml";
			this.txtOuterHtml.Size = new Size(251, 21);
			this.txtOuterHtml.TabIndex = 11;
			this.txtOuterHtml.DoubleClick  = new EventHandler(this.txtID_DoubleClick);
			this.label7.AutoSize = true;
			this.label7.Location = new Point(6, 188);
			this.label7.Name = "label7";
			this.label7.Size = new Size(59, 12);
			this.label7.TabIndex = 10;
			this.label7.Text = "OuterHTML";
			this.txtText.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);
			this.txtText.Location = new Point(68, 152);
			this.txtText.Name = "txtText";
			this.txtText.Size = new Size(251, 21);
			this.txtText.TabIndex = 9;
			this.txtText.DoubleClick  = new EventHandler(this.txtID_DoubleClick);
			this.label6.AutoSize = true;
			this.label6.Location = new Point(27, 161);
			this.label6.Name = "label6";
			this.label6.Size = new Size(35, 12);
			this.label6.TabIndex = 8;
			this.label6.Text = "Value";
			this.txtHTML.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);
			this.txtHTML.Location = new Point(68, 125);
			this.txtHTML.Name = "txtHTML";
			this.txtHTML.Size = new Size(251, 21);
			this.txtHTML.TabIndex = 7;
			this.txtHTML.DoubleClick  = new EventHandler(this.txtID_DoubleClick);
			this.label5.AutoSize = true;
			this.label5.Location = new Point(33, 134);
			this.label5.Name = "label5";
			this.label5.Size = new Size(29, 12);
			this.label5.TabIndex = 6;
			this.label5.Text = "HTML";
			this.txtClass.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);
			this.txtClass.Location = new Point(68, 98);
			this.txtClass.Name = "txtClass";
			this.txtClass.Size = new Size(251, 21);
			this.txtClass.TabIndex = 6;
			this.txtClass.DoubleClick  = new EventHandler(this.txtID_DoubleClick);
			this.label4.AutoSize = true;
			this.label4.Location = new Point(27, 107);
			this.label4.Name = "label4";
			this.label4.Size = new Size(35, 12);
			this.label4.TabIndex = 4;
			this.label4.Text = "Class";
			this.txtName.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);
			this.txtName.Location = new Point(68, 44);
			this.txtName.Name = "txtName";
			this.txtName.Size = new Size(251, 21);
			this.txtName.TabIndex = 3;
			this.txtName.DoubleClick  = new EventHandler(this.txtID_DoubleClick);
			this.label3.AutoSize = true;
			this.label3.Location = new Point(33, 53);
			this.label3.Name = "label3";
			this.label3.Size = new Size(29, 12);
			this.label3.TabIndex = 2;
			this.label3.Text = "Name";
			this.txtID.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);
			this.txtID.Location = new Point(68, 17);
			this.txtID.Name = "txtID";
			this.txtID.Size = new Size(251, 21);
			this.txtID.TabIndex = 1;
			this.txtID.Text = "双击文本框复制";
			this.txtID.DoubleClick  = new EventHandler(this.txtID_DoubleClick);
			this.label2.AutoSize = true;
			this.label2.Location = new Point(45, 26);
			this.label2.Name = "label2";
			this.label2.Size = new Size(17, 12);
			this.label2.TabIndex = 0;
			this.label2.Text = "ID";
			this.label2.TextAlign = ContentAlignment.MiddleRight;
			this.label1.AutoSize = true;
			this.label1.Location = new Point(12, 228);
			this.label1.Name = "label1";
			this.label1.Size = new Size(143, 12);
			this.label1.TabIndex = 1;
			this.label1.Text = "XPath(选择后双击复制)";
			this.lstXPath.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right);
			this.lstXPath.FormattingEnabled = true;
			this.lstXPath.ItemHeight = 12;
			this.lstXPath.Items.AddRange(new object[]
			{
				"拖动左下角的图标到IE查看即可",
				"也可以按F8获取光标当前位置元素信息",
				"",
				"双击文本框即可复制内容",
				"XPATH选中后双击即可复制。采集时默认自动复制第一个",
				"",
				"Bug、建议或者检查新版本请点击右下角链接"
			});
			this.lstXPath.Location = new Point(12, 243);
			this.lstXPath.Margin = new Padding(5);
			this.lstXPath.Name = "lstXPath";
			this.lstXPath.Size = new Size(326, 100);
			this.lstXPath.TabIndex = 2;
			this.lstXPath.DoubleClick  = new EventHandler(this.lstXPath_DoubleClick);
			this.linkLabel1.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right);
			this.linkLabel1.AutoSize = true;
			this.linkLabel1.Location = new Point(279, 372);
			this.linkLabel1.Name = "linkLabel1";
			this.linkLabel1.Size = new Size(59, 12);
			this.linkLabel1.TabIndex = 5;
			this.linkLabel1.TabStop = true;
			this.linkLabel1.Text = "by 晓风轻";
			this.linkLabel1.LinkClicked  = new LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
			this.timer1.Interval = 250;
			this.timer1.Tick  = new EventHandler(this.timer1_Tick);
			this.chkCopy.AutoSize = true;
			this.chkCopy.Checked = true;
			this.chkCopy.CheckState = CheckState.Checked;
			this.chkCopy.Location = new Point(53, 349);
			this.chkCopy.Name = "chkCopy";
			this.chkCopy.Size = new Size(138, 16);
			this.chkCopy.TabIndex = 6;
			this.chkCopy.Text = "自动复制第一个XPath";
			this.chkCopy.UseVisualStyleBackColor = true;
			this.chkSplit.AutoSize = true;
			this.chkSplit.Location = new Point(53, 371);
			this.chkSplit.Name = "chkSplit";
			this.chkSplit.Size = new Size(114, 16);
			this.chkSplit.TabIndex = 7;
			this.chkSplit.Text = "XPath使用单引号";
			this.chkSplit.UseVisualStyleBackColor = true;
			this.chkSplit.CheckedChanged  = new EventHandler(this.chkSplit_CheckedChanged);
			this.pictureBox1.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left);
			this.pictureBox1.Image = (Image)componentResourceManager.GetObject("pictureBox1.Image");
			this.pictureBox1.Location = new Point(12, 349);
			this.pictureBox1.Name = "pictureBox1";
			this.pictureBox1.Size = new Size(33, 33);
			this.pictureBox1.TabIndex = 3;
			this.pictureBox1.TabStop = false;
			this.pictureBox1.MouseDown  = new MouseEventHandler(this.pictureBox1_MouseDown);
			this.pictureBox1.MouseUp  = new MouseEventHandler(this.pictureBox1_MouseUp);
			base.AutoScaleDimensions = new SizeF(6f, 12f);
			base.AutoScaleMode = AutoScaleMode.Font;
			base.ClientSize = new Size(349, 389);
			base.Controls.Add(this.chkSplit);
			base.Controls.Add(this.chkCopy);
			base.Controls.Add(this.linkLabel1);
			base.Controls.Add(this.pictureBox1);
			base.Controls.Add(this.lstXPath);
			base.Controls.Add(this.label1);
			base.Controls.Add(this.groupBox1);
			base.Icon = (Icon)componentResourceManager.GetObject("$this.Icon");
			base.Name = "frmIEXPath";
			this.Text = "IEXPath";
			base.FormClosed  = new FormClosedEventHandler(this.frmIEXPath_FormClosed);
			base.Load  = new EventHandler(this.frmIEXPath_Load);
			this.groupBox1.ResumeLayout(false);
			this.groupBox1.PerformLayout();
			((ISupportInitialize)this.pictureBox1).EndInit();
			base.ResumeLayout(false);
			base.PerformLayout();
		}
	}
}