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。
我有一个应用程序,如果打开的程序是浏览器,焦点更改应该能够检索当前活动选项卡的 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。