it-swarm-id.com

Bagaimana saya bisa mendapatkan URL halaman terbuka dari Chrome dan Firefox?

Saya sedang menulis aplikasi baki sistem yang perlu memeriksa apakah aplikasi berbasis web internal terbuka.

Saya dapat memeriksa IE menggunakan yang berikut:

SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();
        string filename;
        bool sdOpen = false;
        foreach (SHDocVw.InternetExplorer ie in shellWindows)
        {
            filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();
            if (filename.Equals("iexplore"))
            {
                string[] urlParts = (ie.LocationURL.ToString()).Split('/');
                string website = urlParts[2];
                if (website == "myApp:8080") { sdOpen = true; };
            }
        }

        if (sdOpen) { Console.WriteLine("App is open"); } else { Console.WriteLine("App is not open"); };

        Console.ReadKey(true);

Namun, beberapa pengguna yang menggunakan sistem lebih memilih Chrome atau Firefox.

Bagaimana saya bisa melakukan hal yang sama seperti di atas (mis. Mendapatkan url dari tab yang terbuka di browser) untuk Chrome dan Firefox? (Saya tidak akan repot dengan browser lain karena ini adalah satu-satunya yang digunakan dalam organisasi kami.)

22
Ben

Ini spesifik untuk setiap browser. Itu untuk yang utama:

  • Internet Explorer - Anda dapat menggunakan SHDocVw (seperti yang Anda lakukan)
  • Firefox - Anda bisa mendapatkan URL menggunakan DDE (sumber di bawah)
  • Chrome - Anda bisa mendapatkan URL sambil menghitung semua jendela anak sampai Anda mendapatkan kontrol dengan kelas "Chrome_OmniboxView" dan kemudian mendapatkan teks menggunakan GetWindowText
  • Opera - Anda dapat menggunakan hal yang sama seperti Firefox, tetapi dengan "opera"
  • Safari - Tidak ada metode yang dikenal karena menggunakan kontrol yang ditarik khusus

EDIT: Sejak 2014, Chrome telah berubah dan Anda perlu mendapatkan URL dengan Acessibility.

Kode untuk mendapatkan URL dari Firefox/Opera menggunakan DDE (yang menggunakan NDDE - satu-satunya pembungkus DDE yang bagus untuk .NET):

//
// usage: GetBrowserURL("opera") or GetBrowserURL("firefox")
//

private string GetBrowserURL(string browser) {
    try {
        DdeClient dde = new DdeClient(browser, "WWW_GetWindowInfo");
        dde.Connect();
        string url = dde.Request("URL", int.MaxValue);
        string[] text = url.Split(new string[] { "\",\"" }, StringSplitOptions.RemoveEmptyEntries);
        dde.Disconnect();
        return text[0].Substring(1);
    } catch {
        return null;
    }
}
22
blez

Menggunakan UIAutomation - dapatkan url untuk FireFox dan Chrome:

 else if (browser == BrowserType.Chrome)
        {
            //"Chrome_WidgetWin_1"

            Process[] procsChrome = Process.GetProcessesByName("chrome");
            foreach (Process chrome in procsChrome)
            {
                // the chrome process must have a window
                if (chrome.MainWindowHandle == IntPtr.Zero)
                {
                    continue;
                }
                //AutomationElement Elm = AutomationElement.RootElement.FindFirst(TreeScope.Children,
                //         new PropertyCondition(AutomationElement.ClassNameProperty, "Chrome_WidgetWin_1"));
                // find the automation element
                AutomationElement Elm = AutomationElement.FromHandle(chrome.MainWindowHandle);

                // manually walk through the tree, searching using TreeScope.Descendants is too slow (even if it's more reliable)
                AutomationElement elmUrlBar = null;
                try
                {
                    // walking path found using inspect.exe (Windows SDK) for Chrome 29.0.1547.76 m (currently the latest stable)
                    var Elm1 = Elm.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "Google Chrome"));
                    var Elm2 = TreeWalker.ControlViewWalker.GetLastChild(Elm1); // I don't know a Condition for this for finding :(
                    var Elm3 = Elm2.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, ""));
                    var Elm4 = Elm3.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ToolBar));
                    elmUrlBar = Elm4.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "Address and search bar"));
                }
                catch
                {
                    // Chrome has probably changed something, and above walking needs to be modified. :(
                    // put an assertion here or something to make sure you don't miss it
                    continue;
                }

                // make sure it's valid
                if (elmUrlBar == null)
                {
                    // it's not..
                    continue;
                }

                // elmUrlBar is now the URL bar element. we have to make sure that it's out of keyboard focus if we want to get a valid URL
                if ((bool)elmUrlBar.GetCurrentPropertyValue(AutomationElement.HasKeyboardFocusProperty))
                {
                    continue;
                }

                // there might not be a valid pattern to use, so we have to make sure we have one
                AutomationPattern[] patterns = elmUrlBar.GetSupportedPatterns();
                if (patterns.Length == 1)
                {
                    string ret = "";
                    try
                    {
                        ret = ((ValuePattern)elmUrlBar.GetCurrentPattern(patterns[0])).Current.Value;
                    }
                    catch { }
                    if (ret != "")
                    {
                        // must match a domain name (and possibly "https://" in front)
                        if (Regex.IsMatch(ret, @"^(https:\/\/)?[a-zA-Z0-9\-\.]+(\.[a-zA-Z]{2,4}).*$"))
                        {
                            // prepend http:// to the url, because Chrome hides it if it's not SSL
                            if (!ret.StartsWith("http"))
                            {
                                ret = "http://" + ret;
                            }
                            return ret;
                        }
                    }
                    continue;
                }
            }

        }
        else if (browser == BrowserType.Firefox)
        {
            AutomationElement root = AutomationElement.RootElement.FindFirst(TreeScope.Children,
                new PropertyCondition(AutomationElement.ClassNameProperty, "MozillaWindowClass"));

                Condition toolBar = new AndCondition(
                new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ToolBar),
                new PropertyCondition(AutomationElement.NameProperty, "Browser tabs"));
                var tool = root.FindFirst(TreeScope.Children, toolBar);

                var tool2 = TreeWalker.ControlViewWalker.GetNextSibling(tool);

                var children = tool2.FindAll(TreeScope.Children, Condition.TrueCondition);

                foreach (AutomationElement item in children)
                {
                    foreach (AutomationElement i in item.FindAll(TreeScope.Children, Condition.TrueCondition))
                    {
                        foreach (AutomationElement ii in i.FindAll(TreeScope.Children, Condition.TrueCondition))
                        {
                            if (ii.Current.LocalizedControlType == "document")
                            {
                                if (!ii.Current.BoundingRectangle.X.ToString().Contains("Infinity"))
                                {
                                    ValuePattern activeTab = ii.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
                                    var activeUrl = activeTab.Current.Value;
                                    return activeUrl;
                                }
                            }
                        }
                    }
                }
            }
3
cablehead

Mungkin kode ini dapat membantu sesuatu; Terima kasih kepada BLEZ untuk berbagi kode ini. Saya menggunakan kode ini untuk mengambil alamat unik dari firefox dan menambahkannya ke kotak daftar. Tapi saya pikir ini bukan untuk Chrome kan?

(Anda harus menambahkan NDde.dll ke proyek Anda, untuk melakukan ini pergi ke solusi Explorer klik kanan untuk Referensi-> tambahkan Referensi-> Jelajahi-> temukan bahwa DLL ( http: //ndde.codeplex .com/ dari folder binary.))

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NDde.Client;

namespace WindowsFormsApplication9
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }

        private string GetBrowserURL(string browser)
        {
            try
            {
                DdeClient dde = new DdeClient(browser, "WWW_GetWindowInfo");
                dde.Connect();
                string url = dde.Request("URL", int.MaxValue);
                string[] text = url.Split(new string[] { "\",\"" }, StringSplitOptions.RemoveEmptyEntries);
                dde.Disconnect();
                return text[0].Substring(1);
            }
            catch
            {
                return null;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            int j=0;
            for (int i = 0; i < listBox1.Items.Count; i++)
            {
                if (listBox1.Items[i].ToString() == GetBrowserURL("Firefox"))
                {
                    break;
                }
                else
                {
                    j++;
                }
            }
            if (j == listBox1.Items.Count)
            {
                listBox1.Items.Add(GetBrowserURL("Firefox"));
            }
        }
    }
}
2
matasoy

Kode di bawah ini bekerja dengan sangat baik dengan Versi Chrome 58.0.3029.110:

Silakan tambahkan referensi UIAutomationClient dan UIAutomationProvider dari Majelis yang disediakan oleh .NET.

        foreach (Process proc in procsChrome)
        {
            // the chrome process must have a window 
            if (proc.MainWindowHandle == IntPtr.Zero)
                continue;

            // to find the tabs we first need to locate something reliable - the 'New Tab' button 
            AutomationElement root = AutomationElement.FromHandle(proc.MainWindowHandle);
            var SearchBar = root.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "Address and search bar"));
            if (SearchBar != null)
                return (string)SearchBar.GetCurrentPropertyValue(ValuePatternIdentifiers.ValueProperty);
        }
0
Kalyan Hurkat