C# - Opera aktif sekmenin url bağlantısını alma UIAutomation

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Onaylı Üye
Katılım
8 Eki 2017
Mesajlar
134
Tepki puanı
12
Ödüller
5
8 HİZMET YILI
Merhabalar, C# da UIAutomation ile ilgili projem var ve açık aktif olan opera tarayıcısının url bağlantısını almam gerekiyor ama UIAutomation ile url bağlantısını alamadım.
Yardımcı olabilir misiniz?

Kodlarım:

C#:
void urlGet(){
    foreach (Process process in Process.GetProcessesByName("opera"))
    {
        string url = GetOperaUrl(process);
        if (url == null)
            continue;

        Console.WriteLine(url);
    }
}

public string GetOperaUrl(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;

    AutomationElementCollection elm1 = element.FindAll(TreeScope.Subtree, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Menu));
    AutomationElement elm = elm1[0];
    string vp = ((ValuePattern)elm.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string;

    Console.WriteLine(vp);
    
    return vp;
}
 
Onaylı Üye
Katılım
4 Tem 2022
Mesajlar
70
Tepki puanı
8
Ödüller
1
3 HİZMET YILI
Tam Olarak Anlayamadım ama açıklayuıcı bir şekilde anlatır iseniz yardımcı olmayı denerim
 
Onaylı Üye
Katılım
8 Eki 2017
Mesajlar
134
Tepki puanı
12
Ödüller
5
8 HİZMET YILI
Tam Olarak Anlayamadım ama açıklayuıcı bir şekilde anlatır iseniz yardımcı olmayı denerim
Opera tarayıcısında aktif olan pencerenin url bağlantısını almak istiyorum. Ne yaptıysam olmadı alamadım. Yazdığım kodlar da çalışmıyor direkt patlıyor hata veriyor. Bu yazdığım kodlar Chrome, brave vb tarayıcılarda bana aktif olan tarayıcı penceresinin url bağlantısını getiriyor ama opera tarayıcısında getirmiyor en son bu kodları yazıp denedim yine de url bağlantısını alamıyorum.
 
Süper Üye
Katılım
14 Ara 2015
Mesajlar
949
Çözümler
26
Tepki puanı
89
Ödüller
10
10 HİZMET YILI
Bağlantıları görmek için lütfen Giriş Yap


NDde.dll yi indirip, verdiğim kodu Url'yi almak istediğiniz yere kopyalaman yeterli olur.

DdeClient dde = new DdeClient("opera", "WWW_GetWindowInfo"); dde.Connect(); string url = dde.Request("URL", int.MaxValue); string[] text = url.Split(new string[] { "\",\"" }, StringSplitOptions.RemoveEmptyEntries); dde.Disconnect();

Fonksiyon içinde

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; } }
Post automatically merged:

anladım hocam da neden url almak istiyorsunuzki
bot yazarken kullanmak istiyor olabilir
 
Son düzenleme:

Why

Ma name is enough
Süper Üye
Katılım
8 Nis 2017
Mesajlar
904
Çözümler
98
Tepki puanı
307
Ödüller
10
9 HİZMET YILI
Merhaba,

Test edilmiş tüm tarayıcılar için çözüm şu şekilde (Yandex (krom tabanlı) Chrome ve Firefox üçünde de çalışır).

İlk önce kullanmakta olduğun System.Windows.Automation değiştirmen gerekiyor. Çünkü IUIAutomation gerçekten yavaş.

İşlem için, önce bağımlılıklara git ve bağımlılıklara sağ tıkla, ardından "COM Referansı Ekle .." ye bas:
BSA18.png


Ardından, UIAutomationClient'i bul, daha kolay erişmek için sağ üstteki arama çubuğuna UI koyabilirsin:

2png.png


Ekledikten sonra bu kodu yaz:

C#:
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 { }

                    }
                }
            }
        }

Ve en üste bu iki satırı koymalısın;

using UIAutomationClient;
using TreeScope = UIAutomationClient.TreeScope;


Ayrıca "YourMainClass" ı gerektiği gibi kendi sınıfınla değiştirmelisin.


İyi forumlar dilerim.
 
zoranlasilanbilge
Uzman Üye
Katılım
19 May 2018
Mesajlar
158
Tepki puanı
5
Ödüller
8
Yaş
36
8 HİZMET YILI
Bir adet personel takip sistemi yazıyorum o yuzden bu işlem önemli
Personel Opera açınca mı kişiyi gelmiş mi kabul edeceksin ?
Post automatically merged:

Merhaba,

Test edilmiş tüm tarayıcılar için çözüm şu şekilde (Yandex (krom tabanlı) Chrome ve Firefox üçünde de çalışır).

İlk önce kullanmakta olduğun System.Windows.Automation değiştirmen gerekiyor. Çünkü IUIAutomation gerçekten yavaş.

İşlem için, önce bağımlılıklara git ve bağımlılıklara sağ tıkla, ardından "COM Referansı Ekle .." ye bas:
Ekli dosyayı görüntüle 77207

Ardından, UIAutomationClient'i bul, daha kolay erişmek için sağ üstteki arama çubuğuna UI koyabilirsin:

Ekli dosyayı görüntüle 77208

Ekledikten sonra bu kodu yaz:

C#:
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 { }

                    }
                }
            }
        }

Ve en üste bu iki satırı koymalısın;

using UIAutomationClient;
using TreeScope = UIAutomationClient.TreeScope;


Ayrıca "YourMainClass" ı gerektiği gibi kendi sınıfınla değiştirmelisin.


İyi forumlar dilerim.
Eline sağlık çok güzel düşünmüşsün.
 
Onaylı Üye
Katılım
8 Eki 2017
Mesajlar
134
Tepki puanı
12
Ödüller
5
8 HİZMET YILI
Merhaba,

Test edilmiş tüm tarayıcılar için çözüm şu şekilde (Yandex (krom tabanlı) Chrome ve Firefox üçünde de çalışır).

İlk önce kullanmakta olduğun System.Windows.Automation değiştirmen gerekiyor. Çünkü IUIAutomation gerçekten yavaş.

İşlem için, önce bağımlılıklara git ve bağımlılıklara sağ tıkla, ardından "COM Referansı Ekle .." ye bas:
Ekli dosyayı görüntüle 77207

Ardından, UIAutomationClient'i bul, daha kolay erişmek için sağ üstteki arama çubuğuna UI koyabilirsin:

Ekli dosyayı görüntüle 77208

Ekledikten sonra bu kodu yaz:

C#:
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 { }

                    }
                }
            }
        }

Ve en üste bu iki satırı koymalısın;

using UIAutomationClient;
using TreeScope = UIAutomationClient.TreeScope;


Ayrıca "YourMainClass" ı gerektiği gibi kendi sınıfınla değiştirmelisin.


İyi forumlar dilerim.
Yardımın için çok teşekkür ederim. Araştırarak anca System.Windows.Automation kullanarak yapabildim ve o da sadece bazı tarayıcılarda çalışıyordu. Bu kodları yazdım ama HandleFocusChangedEvent fonksiyonuna IUIAutomationElement element olarak nasıl bir veri göndermem gerektiğini yazamadım.
 
Son düzenleme:
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Üst