RaUI/Source/ryControls/ExtendedWebBrowser/Command.cs
2020-11-28 15:03:57 +08:00

208 lines
6.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Threading;
namespace ExtendedWebBrowser2
{
/// <summary>
///
/// </summary>
public class Command
{
private ExtendedWebBrowser _Browser;
/// <summary>
///
/// </summary>
/// <param name="host"></param>
public Command(ExtendedWebBrowser host)
{
_Browser = host;
}
[DllImport("User32.DLL")]
private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
[DllImport("User32.DLL")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent,
IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
private readonly int IDM_VIEWSOURCE = 2139;
private readonly uint WM_COMMAND = 0x0111;
/// <summary>
/// 查看源码
/// </summary>
public void ViewSource()
{
IntPtr vHandle = _Browser.Handle;
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "Shell Embedding", null);
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "Shell DocObject View", null);
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "Internet Explorer_Server", null);
SendMessage(vHandle, WM_COMMAND, IDM_VIEWSOURCE, (int)_Browser.Handle);
}
private void ExecCommand(string command)
{
_Browser.Document.ExecCommand(command, false, null);
}
/// <summary>
/// 复制当前选中区
/// </summary>
public void Copy()
{
ExecCommand("Copy");
}
/// <summary>
/// 粘贴当前选中区
/// </summary>
public void Paste()
{
ExecCommand("Paste");
}
/// <summary>
/// 剪切当前选中区
/// </summary>
public void Cut()
{
ExecCommand("Cut");
}
/// <summary>
/// 全选
/// </summary>
public void SelectAll()
{
ExecCommand("SelectAll");
}
/// <summary>
/// 清除当前选中区的选中状态。
/// </summary>
public void UnSelect()
{
ExecCommand("Unselect");
}
/// <summary>
/// 从当前选中区中删除全部超级链接。
/// </summary>
public void UnLink()
{
ExecCommand("Unlink");
}
/// <summary>
/// 从当前选中区中删除全部书签。
/// </summary>
public void UnBookmark()
{
ExecCommand("UnBookmark");
}
/// <summary>
/// 删除当前选中区
/// </summary>
public void Delete()
{
ExecCommand("Delete");
}
/// <summary>
/// 重做
/// </summary>
public void Redo()
{
ExecCommand("Redo");
}
/// <summary>
/// 撤销
/// </summary>
public void Undo()
{
ExecCommand("Undo");
}
/// <summary>
/// 从当前选中区中删除格式化标签。
/// </summary>
public void RemoveFormat()
{
ExecCommand("RemoveFormat");
}
/// <summary>
/// 点击节点
/// </summary>
/// <param name="tagName"></param>
/// <param name="attr"></param>
/// <param name="attrValue"></param>
public void ClickElement(string tagName, string attr, string attrValue)
{
HtmlElementCollection list = _Browser.Document.GetElementsByTagName(tagName);
for (int i = 0; i < list.Count; i++)
{
if (list[i].GetAttribute(attr).ToLower() == attrValue.ToLower())
{
list[i].InvokeMember("Click");
break;
}
}
}
/// <summary>
/// 点击节点
/// </summary>
/// <param name="tagName"></param>
/// <param name="attr"></param>
/// <param name="attrValue"></param>
/// <param name="waitMilliSecond"></param>
public void ClickElement(string tagName, string attr, string attrValue, int waitMilliSecond)
{
HtmlElementCollection list = _Browser.Document.GetElementsByTagName(tagName);
for (int i = 0; i < list.Count; i++)
{
if (list[i].GetAttribute(attr).ToLower() == attrValue.ToLower())
{
list[i].InvokeMember("Click");
Wait(waitMilliSecond);
break;
}
}
}
/// <summary>
/// 点击元素
/// </summary>
/// <param name="tagName">节点名</param>
/// <param name="attr">属性</param>
/// <param name="attrValue">属性值</param>
/// <param name="waitMilliSecond">等待毫秒数</param>
/// <param name="index">第几个符合的元素,从1开始</param>
public void ClickElement(string tagName, string attr, string attrValue, int waitMilliSecond,int index)
{
HtmlElementCollection list = _Browser.Document.GetElementsByTagName(tagName);
int _index = 0;
for (int i = 0; i < list.Count; i++)
{
if (list[i].GetAttribute(attr).ToLower() == attrValue.ToLower())
{
if (_index == index)
{
// list[i].InvokeMember("Click");
list[i].InvokeMember("Click");
Wait(waitMilliSecond);
break;
}
_index++;
}
}
}
/// <summary>
/// 等待多时毫秒
/// </summary>
/// <param name="Milliseconds"></param>
public void Wait(int Milliseconds)
{
if (Milliseconds <= 0) { return; }
DateTime startTime = DateTime.Now;
while (true)
{
if (DateTime.Now >= startTime.AddMilliseconds(Milliseconds) && Milliseconds > 0)
{
break;
}
System.Windows.Forms.Application.DoEvents();
}
}
}
}