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.Contains(Environment.NewLine))

                    url = url.Split('\n')[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;

        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值