2011-09-07 16 views
5

Bu, web üzerinde bir .net 3.5 winform ile çalışan tek oturum açma işareti. Kod ie6 ya da ie8 için iyi çalışır, yani ie8 sadece bir sekme açık olduğu sürece. Sorun, kullanıcı yeni bir sekme açarsa (sekme 2,3, vb.) Ve bir web sitesine (kuruluş içinde web formu) giderse, aşağıdaki kod yürütülecektir, ancak COM otomasyon nesnesi HTMLDocument döndürecektir sekme 2 aktif sekme olsa bile ilk sekme (Sekme 1) için. InternetExplorer veya HTMLDocument sınıflarında herhangi bir IE sekme referansını bulamıyorum. Aslında, IE COM otomasyon belgelerinde çok az IE sekmesi ile ilgili belgeler var.Internet Explorer için Internet Explorer nesnesi tarafından yoksayıldı sekmesi 8

AutoResetEvent ie2_NavigateCompleteAutoReset; 

    /// <summary> 
    /// Given the handle of an Internet Explorer instance, this method performs single sign on to 
    /// several known web login forms. 
    /// </summary> 
    /// <param name="iEFramHandle"></param> 
    private void WebFormSignOn(int iEFramHandle) 
    { 
     foreach (SHDocVw.InternetExplorer ie2 in new SHDocVw.ShellWindows()) 
     { 
      if (ie2.HWND == iEFramHandle) 
      { 
       while (true) 
       { 
        Thread.Sleep(100); 
        if (ie2.ReadyState == SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE) 
        { 
         try 
         { 
          mshtml.HTMLDocument doc = (mshtml.HTMLDocument)ie2.Document; 
          ie2.NavigateComplete2 += new SHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(ie2_NavigateComplete2); 
          ie2_NavigateCompleteAutoReset = new AutoResetEvent(false); 

          /*Find the username element and enter the user's username*/ 
          mshtml.HTMLInputElement userID = (mshtml.HTMLInputElement)doc.all.item("username", 0); 
          userID.value = Globals.Username; 

          /*Find the password element and enter the user's password*/ 
          mshtml.HTMLInputElement pwd = (mshtml.HTMLInputElement)doc.all.item("password", 0); 
          pwd.value = Globals.GetAppName(); 

          /*Find the submit element/button and click it*/ 
          mshtml.HTMLInputElement btnsubmit = (mshtml.HTMLInputElement)doc.all.item("submit", 0); 
          btnsubmit.click(); 

          /*Wait up to 5 seconds for the form submit to complete. 
          This is to prevent this method from being called multiple times 
          while waiting for the form submit and subsequent navigation from completing.*/ 
          ie2_NavigateCompleteAutoReset.WaitOne(5000); 
          return; 
         } 
         catch (Exception err) 
         { 
          Logger.Log(err.ToString(), Logger.StatusFlag.Error, this.ToString(), "WebFormSignOn"); 
          return; 
         } 
         finally 
         { 
          /*Remove the event handler*/ 
          ie2.NavigateComplete2 -= ie2_NavigateComplete2; 

         } 
        } 
       } 
      } 
     } 
    } 

    void ie2_NavigateComplete2(object pDisp, ref object URL) 
    { 
     ie2_NavigateCompleteAutoReset.Set(); 
    } 

cevap

4

IE 8'deki her sekmenin kendi işlem ve tanıtımı olduğu ortaya çıkıyor. Orijinal kodda her zaman ilk IEFrame'den tutamıyordum. Kodu değiştirdim (aşağıda) ve şimdi çalışıyor. Değişiklik, yalnızca ilk IEFrame tutamacını aramak yerine, WebFormsSignOut'u çağıran yöntemi tetikleyen url ile eşleşen bir LocationURL arar.

private void WebFormSignOn(int iEFramHandle,string addressBarText) 
{ 
    var shellWindows = new SHDocVw.ShellWindows(); 
    foreach (SHDocVw.InternetExplorer ie2 in shellWindows) 
    { 
     if (ie2.LocationURL==addressBarText) 
     { //rest of the code (see orignal post) 
3

Internet Explorer (yeni ön veya arka plan sekmesine bir navigasyon hedeflemek için izin ötesinde) herhangi bir kamu sekme API'leri yoktur. Her bir ActiveX denetimi veya BHO, ayrı bir sekme örneğine ayrı ayrı yüklenir. ShellWindows koleksiyonundan aşağı yürümeye çalışmak genelde işe yaramıyor, bunun yerine eklentinizin barındırma sitesine ulaşmasını sağlamalısınız (örneğin, IObjectWithSite :: SetSite bu bilgiyi iletecektir) ve bu da hosting sekmenizi belirlemenizi sağlayacaktır.