使用进程ID获取选项卡标题/文本

时间:2015-08-14 15:05:43

标签: c# google-chrome

我不想使用SetForegroundWindow(),发送键盘按键或类似技巧,因为这可能会导致我的软件出现问题(意外行为)。
我试图使用Cheat Engine程序找到标题(但是没有发现任何有用的东西,因为谷歌Chrome似乎工作"倒置")。
所以我走了一步,使用Process Hacker程序我已经意识到有一个父(chrome.exe)进程,当前活动选项卡有一个有效的窗口句柄,所有其他chrome进程都是它的子进程,也就是后台进程(使用无效窗口)处理)。
通过深入浏览chrome.exe(父进程)的窗口,我发现窗口句柄的类名是" Chrome_WidgetWin_1"和当前有效标签的标题/文字
Here's Google Chrome的任务管理器图片
我正在寻找C#或C或C ++中的函数,它将获取一个整数(进程ID)并返回一个字符串(标题标题/文本)。

static string GetChromeTabTitle(uint processId)
{
    // Assuming I call this function with valid process identifier (PID).
    // What do I do next, here??
}

1 个答案:

答案 0 :(得分:0)

我找到的最好方法是使用System.Windows.Automation库。它允许与应用程序交互(主要用于辅助功能),但您可以将其用于其他目的,例如获取Chrome标签页。

请注意,当Chrome窗口未最小化时,这将

这个过程并不简单,如果你想看看我是如何在我自己的项目中做到的,虽然它不是你可以复制粘贴的东西,你会找到你需要的东西ChromeTabsFinderhttps://github.com/christianrondeau/GoToWindow/blob/master/GoToWindow.Plugins.ExpandBrowsersTabs/Chrome/ChromeTabsFinder.cs

这里是代码(您需要自动化库):

public IEnumerable<ITab> GetTabsOfWindow(IntPtr hWnd)
{
  var cacheRequest = new CacheRequest();
  cacheRequest.Add(AutomationElement.NameProperty);
  cacheRequest.Add(AutomationElement.LocalizedControlTypeProperty);
  cacheRequest.Add(SelectionItemPattern.Pattern);
  cacheRequest.Add(SelectionItemPattern.SelectionContainerProperty);
  cacheRequest.TreeScope = TreeScope.Element;

  AutomationElement tabBarElement;

  using (cacheRequest.Activate())
  {
    var chromeWindow = AutomationElement.FromHandle(hWnd);

    var mainElement = chromeWindow.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "Google Chrome"));

    if (mainElement == null)
      yield break;

    tabBarElement = mainElement.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.LocalizedControlTypeProperty, "tab"));
  }

  if(tabBarElement == null)
    yield break;

  var tabElements = tabBarElement.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.LocalizedControlTypeProperty, "tab item"));

  for (var tabIndex = 0; tabIndex < tabElements.Count; tabIndex++)
  {
    yield return "Tab: " + tabElements[tabIndex].Current.Name + ", Index: " + tabIndex + 1;
  }
}