2

我有一个监视浏览器 URL 的应用程序。目前我正在使用铬。我遵循了这个答案的解决方案:

public static string GetChromeUrl(Process process) {
    if (process == null)
        throw new ArgumentNullException("process");
    if (process.MainWindowHandle == IntPtr.Zero)
        return null;
    AutomationElement element = AutomationElement.FromHandle(process.MainWindowHandle);
    if (element == null)
        return null;
    AutomationElement edit = element.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));
    return ((ValuePattern)edit.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string;
}

然后我有这种方法将 URL 记录在文本文件中(使用 log4net):

while (true) {
    foreach (Process process in Process.GetProcessesByName("chrome")) {
        string url = GetChromeUrl(process);
        if (url == null)
            continue;
        Console.WriteLine(url); //for viewing purpose, it actually logs in orig code
    }
    Thread.Sleep(1000);
}

它工作得很好。但不知何故,该方法存在不一致之处GetChromeUrl。有时它会返回null,这是我的大问题。有没有人有更好的解决方案?

4

1 回答 1

1

哪个位返回null?Windows 经常会忽略 ShowInTaskbar 属性已更改的程序。这可能是第一次检查(和第二次)为空的原因。关于第二个故障,我无法提供任何帮助,但几周前我遇到了同样的问题。我决定使用 Chrome 的 URL 栏的 position 元素,将光标位置更改为它,然后获取光标下的 AutomationElement:

    Form1_Load()
    {
        Cursor.Position = element's position;
        Timer.Start();
    }

    Timer_Tick()
    {
        AutomationElement element = AutomationElement.FromPoint(new System.Windows.Point(mouse.X, mouse.Y));
            string current = element.Current.Name;
        Console.WriteLine(current); //log in text file...
    }

这是否为您的查询提供了答案?

于 2013-07-09T02:23:24.033 回答