2016-04-09 194 views
0

こんにちは、ブラウザからURLを取得したいと思います。これらを使用していますが、null例外が発生していません。私はChromeが何かを変更したと思います。 https://stackoverflow.com/a/21799588/5096993 https://social.msdn.microsoft.com/Forums/vstudio/en-US/39bf60a8-2bdc-4aa0-96fb-08dca49cdb06/c-get-all-chrome-urls-opened?forum=csharpgeneralC#すべてのタブからChrome URLを取得する

else if (browser == BrowserType.Chrome) 
      { 
       //"Chrome_WidgetWin_1" 

       Process[] procsChrome = Process.GetProcessesByName("chrome"); 
       foreach (Process chrome in procsChrome) 
       { 
        // the chrome process must have a window 
        if (chrome.MainWindowHandle == IntPtr.Zero) 
        { 
         continue; 
        } 
        //AutomationElement elm = AutomationElement.RootElement.FindFirst(TreeScope.Children, 
        //   new PropertyCondition(AutomationElement.ClassNameProperty, "Chrome_WidgetWin_1")); 
        // find the automation element 
        AutomationElement elm = AutomationElement.FromHandle(chrome.MainWindowHandle); 

        // manually walk through the tree, searching using TreeScope.Descendants is too slow (even if it's more reliable) 
        AutomationElement elmUrlBar = null; 
        try 
        { 
         // walking path found using inspect.exe (Windows SDK) for Chrome 29.0.1547.76 m (currently the latest stable) 
         var elm1 = elm.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "Google Chrome")); 
         var elm2 = TreeWalker.ControlViewWalker.GetLastChild(elm1); // I don't know a Condition for this for finding :(
         var elm3 = elm2.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "")); 
         var elm4 = elm3.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ToolBar)); 
         elmUrlBar = elm4.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "Address and search bar")); 
        } 
        catch 
        { 
         // Chrome has probably changed something, and above walking needs to be modified. :(
         // put an assertion here or something to make sure you don't miss it 
         continue; 
        } 

        // make sure it's valid 
        if (elmUrlBar == null) 
        { 
         // it's not.. 
         continue; 
        } 

        // elmUrlBar is now the URL bar element. we have to make sure that it's out of keyboard focus if we want to get a valid URL 
        if ((bool)elmUrlBar.GetCurrentPropertyValue(AutomationElement.HasKeyboardFocusProperty)) 
        { 
         continue; 
        } 

        // there might not be a valid pattern to use, so we have to make sure we have one 
        AutomationPattern[] patterns = elmUrlBar.GetSupportedPatterns(); 
        if (patterns.Length == 1) 
        { 
         string ret = ""; 
         try 
         { 
          ret = ((ValuePattern)elmUrlBar.GetCurrentPattern(patterns[0])).Current.Value; 
         } 
         catch { } 
         if (ret != "") 
         { 
          // must match a domain name (and possibly "https://" in front) 
          if (Regex.IsMatch(ret, @"^(https:\/\/)?[a-zA-Z0-9\-\.]+(\.[a-zA-Z]{2,4}).*$")) 
          { 
           // prepend http:// to the url, because Chrome hides it if it's not SSL 
           if (!ret.StartsWith("http")) 
           { 
            ret = "http://" + ret; 
           } 
           return ret; 
          } 
         } 
         continue; 
        } 
       } 

      } 

答えて

1

このコードは私のために働い及びクロムのアクティブなタブのURLを取得している - :私はより多くの、すべての例では、...

refrencesを働いていない検索UIAutomationを使用して

Process[] procsChrome = Process.GetProcessesByName("chrome"); 
      foreach (Process chrome in procsChrome) 
      { 
       // the chrome process must have a window 
       if (chrome.MainWindowHandle == IntPtr.Zero) 
       { 
        continue; 
       } 

       // find the automation element 
       AutomationElement elm = AutomationElement.FromHandle(chrome.MainWindowHandle); 
       AutomationElement elmUrlBar = elm.FindFirst(TreeScope.Descendants, 
        new PropertyCondition(AutomationElement.NameProperty, "Address and search bar")); 

       // if it can be found, get the value from the URL bar 
       if (elmUrlBar != null) 
       { 
        AutomationPattern[] patterns = elmUrlBar.GetSupportedPatterns(); 
        if (patterns.Length > 0) 
        { 
         ValuePattern val = (ValuePattern)elmUrlBar.GetCurrentPattern(patterns[0]); 
         Console.WriteLine("Chrome URL found: " + val.Current.Value); 
         listbox.Items.Add(val.Current.Value); 
        } 
       } 
      } 
+0

、私は最終的にあなたの答えを見つけました。ありがとう.. –

0

最近、同じ問題が解決されましたSystem.Windows.For ms.SendKeys あなたの結果と比較して4倍高速ですが、ctrl + lホットキー(たとえば、編集モードのStackOwerflow)を使用するWebサイトでは機能しません。 ニーズに依存します:)

3時間半後

Results

public void WithSendkeys() 
    { 
     AutomationElement.RootElement 
      .FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty, "Chrome_WidgetWin_1")) 
      .SetFocus(); 
     SendKeys.SendWait("^l"); 
     var elmUrlBar = AutomationElement.FocusedElement; 
     var valuePattern = (ValuePattern) elmUrlBar.GetCurrentPattern(ValuePattern.Pattern); 
     Console.WriteLine(valuePattern.Current.Value); 
    } 
関連する問題