2017-02-13 72 views
3

点击一个WPF应用程序中的按钮,我需要采取活动铬窗口的全页快照 我已经使用了下面的代码。但它只给出活动窗口的URL。需要采取活动铬窗口的全页快照

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); 
} 
} 
} 

我需要在chrome中捕捉完整的网页。

回答

0

我找不到所有_AutomationElement_s使用其FindAll方法。无论如何,这可以帮助你:

其中
 Process[] procsChrome = Process.GetProcessesByName("chrome"); 
     foreach (Process chrome in procsChrome) 
     { 
      if (chrome.MainWindowHandle == IntPtr.Zero) 
       continue; 

      AutomationElement rootElement = AutomationElement.FromHandle(chrome.MainWindowHandle); 
      foreach (AutomationElement v in FindInRawView(rootElement)) 
      { 
       Console.WriteLine(GetText(v)); 
      } 
      AutomationElement elmUrlBar = rootElement.FindFirst(TreeScope.Descendants, 
      new PropertyCondition(AutomationElement.NameProperty, "Address and search bar")); 
     } 

this answer用于:

public static IEnumerable<AutomationElement> FindInRawView(AutomationElement root) 
    { 
     TreeWalker rawViewWalker = TreeWalker.RawViewWalker; 
     Queue<AutomationElement> queue = new Queue<AutomationElement>(); 
     queue.Enqueue(root); 
     while (queue.Count > 0) 
     { 
      var element = queue.Dequeue(); 
      yield return element; 

      var sibling = rawViewWalker.GetNextSibling(element); 
      if (sibling != null) 
      { 
       queue.Enqueue(sibling); 
      } 

      var child = rawViewWalker.GetFirstChild(element); 
      if (child != null) 
      { 
       queue.Enqueue(child); 
      } 
     } 
    } 

this answer

public static string GetText(AutomationElement element) 
    { 
     object patternObj; 
     if (element.TryGetCurrentPattern(ValuePattern.Pattern, out patternObj)) 
     { 
      var valuePattern = (ValuePattern)patternObj; 
      return valuePattern.Current.Value; 
     } 
     else if (element.TryGetCurrentPattern(TextPattern.Pattern, out patternObj)) 
     { 
      var textPattern = (TextPattern)patternObj; 
      return textPattern.DocumentRange.GetText(-1).TrimEnd('\r'); // often there is an extra '\r' hanging off the end. 
     } 
     else 
     { 
      return element.Current.Name; 
     } 
    }