C# 获取浏览器活动标签页的URL

C# Get the URL of the active tab of browser

我有一个应用程序,如果打开的程序是浏览器,焦点更改应该能够检索当前活动选项卡的 URL,否则应该只是 return 程序的名称。

例如,假设我在前台打开了记事本,然后我按 alt-tab 切换到我的浏览器,我打开了 2 个选项卡我希望应用程序提取活动选项卡的 URL。下面的代码用于查找选项卡的名称,但是 try catch 中应该查找选项卡 URL 的代码不起作用,它只打印空字符串。

我想要网站的 URL,这样我就可以经常引用它,因为同一网站中的选项卡名称可能不同

private void OnFocusChangedHandler(object src, AutomationFocusChangedEventArgs args)
        {
            Debug.WriteLine("Focus changed!");
            AutomationElement element = src as AutomationElement;
            if (element != null)
            {
                string name = element.Current.Name;
                string id = element.Current.AutomationId;
                int processId = element.Current.ProcessId;
                try
                {
          
                    using (Process process = Process.GetProcessById(processId))
                    {

                        AutomationElement elm = AutomationElement.FromHandle(process.MainWindowHandle);
                        AutomationElement elmUrlBar = elm.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));
                        AutomationPattern[] patterns = elmUrlBar.GetSupportedPatterns();
                        if (patterns.Length > 0)
                        {
                            ValuePattern val = (ValuePattern)elmUrlBar.GetCurrentPattern(patterns[0]);
                            Debug.WriteLine("URL found: " + val.Current.Value);
                            
                        }
                    }
                }
                catch { }
                Debug.WriteLine("  Name: {0}, Id: {1}", name, id);
                
            }
        }

我在 Whosebug 和不同的网站上尝试了所有类似的方法,但要么真的过时了,要么根本不起作用。

提前致谢。

我找到了适用于所有在(Yandex(基于铬)Chrome 和 Firefox 上测试过的浏览器的解决方案,它适用于所有这三个浏览器)。

首先我从使用System.Windows.Automation改为IUIAutomation因为前者真的很慢

所以对于寻找类似问题解决方案的每个人来说,首先转到依赖项并右键单击依赖项并按“添加 COM 引用..”:

然后找到 UIAutomationClient 你可以把 UI 放在右上角的搜索栏中很容易找到它: 添加后,这里是代码:

private readonly CUIAutomation _automation;
        public YourMainClass()
        {
            _automation = new CUIAutomation();
            _automation.AddFocusChangedEventHandler(null, new FocusChangeHandler(this));
        }

        public class FocusChangeHandler : IUIAutomationFocusChangedEventHandler
        {
            private readonly YourMainClass _listener;

            public FocusChangeHandler(YourMainClass listener)
            {
                _listener = listener;
            }

            public void HandleFocusChangedEvent(IUIAutomationElement element)
            {
                if (element != null)
                {
                    using (Process process = Process.GetProcessById(element.CurrentProcessId))
                    {
                        try
                        {
                            IUIAutomationElement elm = this._listener._automation.ElementFromHandle(process.MainWindowHandle);
                            IUIAutomationCondition Cond = this._listener._automation.CreatePropertyCondition(30003, 50004);
                            IUIAutomationElementArray elm2 = elm.FindAll(TreeScope.TreeScope_Descendants, Cond);
                            for (int i = 0; i < elm2.Length; i++)
                            {
                                IUIAutomationElement elm3 = elm2.GetElement(i);
                                IUIAutomationValuePattern val = (IUIAutomationValuePattern)elm3.GetCurrentPattern(10002);
                                if (val.CurrentValue != "")
                                {
                                    Debug.WriteLine("URL found: " + val.CurrentValue);
                                }
                            }
                        }
                        catch { }

                    }
                }
            }
        }

然后在最上面放这两行

using UIAutomationClient;
using TreeScope = UIAutomationClient.TreeScope;

此外,您还应该根据需要将“YourMainClass”更改为您自己的class。