• C#使用Windows API控制IE切换标签页TAB至某网址网页


    C#使用Windows API控制IE切换标签页TAB至某网址网页

    //引用

    using SHDocVw;

    using msHTML;

    //函数

    public static void ActiveIETab(string url)

    {

    ShellWindows shellWindows = new SHDocVw.ShellWindows();

    string filename;

    foreach (SHDocVw.InternetExplorer ie in shellWindows)

    {

    filename = System.IO.Path.GetFileNameWithoutExtension(ie.FullName).ToLower();

    if (filename.Equals("iexplore") && ie.LocationURL.Contains(url))

    {

    new TabActivator((IntPtr)ie.HWND).ActivateByTabsUrl(ie.LocationURL);

    break;

    }

    }

    }



    //类库

    public class TabActivator

    {

    #region Nested type: OBJID



    private enum OBJID : uint

    {

    OBJID_WINDOW = 0x00000000,

    }



    #endregion



    #region Declarations



    private const int CHILDID_SELF = 0;

    private readonly IntPtr _hWnd;

    private IAccessible _accessible;



    [DllImport("oleacc.dll")]

    private static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid,
    [In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object

    ppvObject);



    [DllImport("user32.dll", SetLastError = true)]

    private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass,

    string lpszWindow);



    [DllImport("oleacc.dll")]

    private static extern int AccessibleChildren(IAccessible paccContainer, int iChildStart, int cChildren,
    [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] object[] rgvarChildren, out int pcObtained);



    #endregion



    #region Constructors



    internal TabActivator(IntPtr ieHandle)

    {

    _hWnd = ieHandle;

    AccessibleObjectFromWindow(GetDirectUIHWND(ieHandle), OBJID.OBJID_WINDOW, ref _accessible);



    CheckForAccessible();

    }



    private TabActivator(IAccessible acc)

    {

    if (acc == null)

    throw new Exception("Could not get accessible");



    _accessible = acc;

    }



    #endregion



    private TabActivator[] Children

    {

    get

    {

    var num = 0;

    var res = GetAccessibleChildren(_accessible, out num);



    if (res == null)

    return new TabActivator[0];



    var list = new List<TabActivator>(res.Length);



    foreach (object obj in res)

    {

    var acc = obj as IAccessible;



    if (acc != null)

    list.Add(new TabActivator(acc));

    }



    return list.ToArray();

    }

    }



    private int ChildCount

    {

    get { return _accessible.accChildCount; }

    }



    /// <summary>

    /// Gets LocationUrl of the tab

    /// </summary>

    private string LocationUrl

    {

    get

    {

    var url = _accessible.accDescription[CHILDID_SELF];



    if (url != null && url.Contains(Environment.NewLine))

    url = url.Split(' ')[1];



    return url;

    }

    }



    private void CheckForAccessible()

    {

    if (_accessible == null)

    throw new Exception("Could not get accessible. Accessible can't be null");

    }



    internal void ActivateByTabsUrl(string tabsUrl)

    {

    var tabIndexToActivate = GetTabIndexToActivate(tabsUrl);



    AccessibleObjectFromWindow(GetDirectUIHWND(_hWnd), OBJID.OBJID_WINDOW, ref _accessible);



    CheckForAccessible();



    var index = 0;

    var ieDirectUIHWND = new TabActivator(_hWnd);



    foreach (var accessor in ieDirectUIHWND.Children)

    {

    foreach (var child in accessor.Children)

    {

    foreach (var tab in child.Children)

    {

    if (tabIndexToActivate >= child.ChildCount - 1)

    return;



    if (index == tabIndexToActivate)

    {

    tab.ActivateTab();

    return;

    }



    index++;

    }

    }

    }

    }



    private void ActivateTab()

    {

    _accessible.accDoDefaultAction(CHILDID_SELF);

    }



    private int GetTabIndexToActivate(string tabsUrl)

    {

    AccessibleObjectFromWindow(GetDirectUIHWND(_hWnd), OBJID.OBJID_WINDOW, ref _accessible);



    CheckForAccessible();



    var index = 0;

    var ieDirectUIHWND = new TabActivator(_hWnd);



    foreach (var accessor in ieDirectUIHWND.Children)

    {

    foreach (var child in accessor.Children)

    {

    foreach (var tab in child.Children)

    {

    var tabUrl = tab.LocationUrl;



    if (!string.IsNullOrEmpty(tabUrl))

    {

    if (tab.LocationUrl.Contains(tabsUrl))

    return index;

    }



    index++;

    }

    }

    }



    return -1;

    }



    private IntPtr GetDirectUIHWND(IntPtr ieFrame)

    {

    // For IE 8:

    var directUI = FindWindowEx(ieFrame, IntPtr.Zero, "CommandBarClass", null);

    directUI = FindWindowEx(directUI, IntPtr.Zero, "ReBarWindow32", null);

    directUI = FindWindowEx(directUI, IntPtr.Zero, "TabBandClass", null);

    directUI = FindWindowEx(directUI, IntPtr.Zero, "DirectUIHWND", null);



    if (directUI == IntPtr.Zero)

    {

    // For IE 9:

    //directUI = FindWindowEx(ieFrame, IntPtr.Zero, "WorkerW", "Navigation Bar");

    directUI = FindWindowEx(ieFrame, IntPtr.Zero, "WorkerW", null);

    directUI = FindWindowEx(directUI, IntPtr.Zero, "ReBarWindow32", null);

    directUI = FindWindowEx(directUI, IntPtr.Zero, "TabBandClass", null);

    directUI = FindWindowEx(directUI, IntPtr.Zero, "DirectUIHWND", null);

    }



    return directUI;

    }



    private static int AccessibleObjectFromWindow(IntPtr hwnd, OBJID idObject, ref IAccessible acc)

    {

    var guid = new Guid("{618736e0-3c3d-11cf-810c-00aa00389b71}"); // IAccessibleobject obj = null;

    object obj = null;



    var num = AccessibleObjectFromWindow(hwnd, (uint)idObject, ref guid, ref obj);



    acc = (IAccessible)obj;



    return num;

    }



    private static object[] GetAccessibleChildren(IAccessible ao, out int childs)

    {

    childs = 0;

    object[] ret = null;

    var count = ao.accChildCount;



    if (count > 0)

    {

    ret = new object[count];

    AccessibleChildren(ao, 0, count, ret, out childs);

    }



    return ret;

    }

    }

  • 相关阅读:
    PDA固定资产条码管理系统软件-解决固定资产实物清查的瓶颈问题,大大提高清查效率
    互联网+下PDA移动智能手持POS超市收银开单软件
    搭建免费代理池
    解析库beautifulsoup
    爬取汽车之家新闻
    请求库之requests库
    网络状态码301与302
    正向代理与反向代理
    垃圾回收机制详解
    HTTP协议详解
  • 原文地址:https://www.cnblogs.com/guanshan/p/guan2021-7-20_001.html
Copyright © 2020-2023  润新知