2011-09-07 19 views
5

के लिए InternetExplorer COM ऑब्जेक्ट द्वारा अनदेखा सक्रिय टैब यह .NET 3.5 Winform पर चलने वाले कोड पर वेब एकल संकेत है। कोड i6 या ie8 के लिए ठीक चलाता है जब तक IE8 में केवल एक टैब खुलता है। समस्या यह है कि यदि उपयोगकर्ता एक नया टैब (टैब 2,3, इत्यादि) खोलता है और किसी वेबसाइट (संगठन में आंतरिक रूप से वेब फॉर्म) पर नेविगेट करता है तो नीचे कोड निष्पादित किया जाएगा, यानी COM ऑटोमेशन ऑब्जेक्ट HTMLDocument वापस करेगा पहले टैब (टैब 1) के लिए, भले ही टैब 2 सक्रिय टैब है। मुझे InternetExplorer या HTMLDocument कक्षाओं में कहीं भी आईई टैब संदर्भ नहीं मिल रहे हैं। दरअसल, आईई COM ऑटोमेशन डॉक्स में कहीं भी आईई टैब से संबंधित दस्तावेज बहुत कम है।आईई 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(); 
    } 

उत्तर

4

यह पता चला है कि आईई 8 में प्रत्येक टैब की अपनी प्रक्रिया है और हैंडल है। मूल कोड में मैं हमेशा पहले IEFrame से हैंडल प्राप्त कर रहा था। मैंने कोड (नीचे) संशोधित किया और अब यह काम करता है। परिवर्तन यह है कि केवल पहले IEFrame हैंडल की तलाश करने के बजाय, कोड एक locationURL की भी तलाश करता है जो उस यूआरएल से मेल खाता है जो WebFormsSignOut को कॉल करने वाली विधि को ट्रिगर करता है।

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

इंटरनेट एक्सप्लोरर (आप एक नया अग्रभूमि या पृष्ठभूमि टैब पर एक नेविगेशन को लक्षित करने की अनुमति से परे) भी सार्वजनिक टैब एपीआई नहीं है। प्रत्येक ActiveX नियंत्रण या बीएचओ व्यक्तिगत टैब उदाहरण में व्यक्तिगत रूप से लोड किया जाता है। शैलविंडोज़ संग्रह से नीचे जाने की कोशिश करने की संभावना सामान्य रूप से काम करने की संभावना नहीं है, इसके बजाय आपको अपनी प्लगइन अपनी होस्टिंग साइट तक पहुंचाना चाहिए (उदा। IObjectWithSite :: SetSite इस जानकारी को व्यक्त करेगा) जो आपको अपना होस्टिंग टैब निर्धारित करने की अनुमति देगा।