2010-09-29 56 views
2

我有兩個問題。使用.net 2.0將焦點設置爲從C#程序的Internet Explorer已打開的選項卡

  1. 如何從C#程序使用.net 2.0將焦點設置爲已打開的Internet Explorer選項卡。

  2. 如何在C#程序中運行Internet Explorer實例(不在新窗口中)的新選項卡中打開新URL。

我只能使用.net到2.0。

您的幫助將不勝感激。

+0

見http://stackoverflow.com/questions/2753907/set-focus-on-particular-tab-in-ie-and-or-firefox – stuartd 2010-09-29 09:37:54

+0

您使用的是IE瀏覽器的WinForms控制主機即沒有您的應用程序,如? – 2010-09-29 09:39:28

+1

謝謝斯圖爾特,但這個鏈接並沒有幫助我。我不想寫任何插件。也可能有其他一些方法。 – Saghar 2010-09-29 09:42:11

回答

6

以下是如何根據選項卡的URL地址激活選項卡的代碼。我測試過,它工作正常。你可以添加你的功能,如何基於文本/描述等來激活選項卡。如果你需要在.net 2.0下運行,那麼將var改爲特定類型。

這是一個實際的代碼本身。我將它包裝在單獨的課程中。

using System; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 
using Accessibility; 

namespace IETabsInteraction 
{ 
    internal 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; 
     } 
    } 
} 

要執行該代碼使用:

var hWnd = (IntPtr)ie.HWND; 
new TabActivator(hWnd).ActivateByTabsUrl("www.stackoverflow.com"); 

要回答你的第二個問題。你需要找到即你已經運行:

private static void OpenTabInExistingIE() 
    { 
     var shellWindows = new ShellWindows(); 

     // check if IE is open 
     if (shellWindows.Count > 0) 
      ((InternetExplorer)shellWindows.Item(0)).Navigate2("www.stackoverflow.com", 2048); 
    } 

對於所有這些代碼,你將需要添加引用shdocvw.dll中和

#using SHDocVw; 

這裏有標誌的Navigate2方法

Enum BrowserNavConstants 
    navOpenInNewWindow = 1 
    navNoHistory = 2 
    navNoReadFromCache = 4 
    navNoWriteToCache = 8 
    navAllowAutosearch = 16 
    navBrowserBar = 32 
    navHyperlink = 64 
    navEnforceRestricted = 128 
    navNewWindowsManaged = 256 
    navUntrustedForDownload = 512 
    navTrustedForActiveX = 1024 
    navOpenInNewTab = 2048 
    navOpenInBackgroundTab = 4096 
    navKeepWordWheelText = 8192 
    navVirtualTab = 16384 
    navBlockRedirectsXDomain = 32768 
    navOpenNewForegroundTab = 65536 
End Enum 
+0

'var url = _accessible.accDescription [CHILDID_SELF];'拋出錯誤'語言不支持屬性,索引器或事件'accDescription';嘗試直接調用訪問器方法'Accessibility.IAccessible.get_accDescription(object)'' – Misiu 2012-10-04 12:46:38

+0

我已經將該行更改爲'string url = _accessible.get_accDescription(CHILDID_SELF);'它工作! – Misiu 2012-10-04 12:56:28

+0

I.E.根本不起作用。 11.沒有項目返回帶有換行符的描述,並且許多返回null,導致代碼原樣拋出異常。 – 2014-06-04 04:02:16

相關問題