UIAutomationのAutomationId取得

Category: visual studio cs_ja

Question

kit4656 on Wed, 29 Aug 2018 11:15:13


現在、下記サイトのサンプルを使用し、クリックされたコントロールのAutomationIdを取得しようとしていますが、Windowsフォーム上のコントロールのAutomationIdは問題なく取得出来ているのですが、IE上のコントロール(テキストボックス)のAutomationIdはブランクとなっており、取得できません。(Name、FrameworkIdもブランクです。) 

Windows SDKにあるInspectではWindowsフォーム、IE関係なく、ちゃんとAutomationIdが取得出来ていますが、何かやり方がおかしいのでしょうか。
もしくは、そもそもUIAutomationでは、IE上のコントロールは対応していないでしょうか。 

サイト
https://docs.microsoft.com/ja-jp/previous-versions/dotnet/netframework-3.5/aa358508(v=vs.90) 

ソース
private void OnFocusChanged(object src, AutomationFocusChangedEventArgs e)
{
    focusedElement = src as AutomationElement;
    focusedRect = focusedElement.Current.BoundingRectangle; 

    Console.WriteLine("Name : " + focusedElement.Current.Name);
    Console.WriteLine("AutomationId : " + focusedElement.Current.AutomationId);
    Console.WriteLine("FrameworkId : " + focusedElement.Current.FrameworkId); 

    if (useTimer)
    {
         eventTimer.Interval = timerInterval;
         eventTimer.Start();
     }
     else
     {
         UpdateHighlight();
     }

宜しくお願いします。

Replies

立花楓 on Thu, 30 Aug 2018 02:14:30


kit4656 さん、こんにちは。フォーラム オペレーターの立花です。
MSDN フォーラムへご投稿くださいましてありがとうございます。

ご質問についてですが、teratail にも同じ投稿をされてますでしょうか。

UIAutomationのAutomationId取得
https://teratail.com/questions/143527

複数のフォーラムに投稿されますと、情報が分散してしまったり、
時間を取って調査をしたのに、他で既に解決していた、などの
状況が生じる場合があります。

恐れ入りますが、どちらかに絞って投稿されることをご検討ください。

フォーラム利用時の注意点のお知らせです。
※初めてご投稿された方を対象にお知らせしています。

ご利用の際は、下記内容をお守りいただきますと
情報が寄せられやすくなりますので、ぜひご一読ください。
フォーラムでご質問頂くにあたっての注意点
フォーラムのご利用方法(質問の投稿)について
フォーラムへの回答に関するガイドラインおよびフォーラム運営について(再掲)
ご意見、ご要望はこちらのフォーラムまで。
各種設定方法はフォーラム内を [かんたん フォーラム ガイド] で検索してみてください。

kit4656 on Thu, 30 Aug 2018 02:54:28


すみません。

teratailの方は、削除しました。

gekka on Thu, 30 Aug 2018 18:27:05


System.Windows.Automationを使わずにCOMのUIAutomationなら取れるかもしれない。

<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="100" Width="200">
	<StackPanel TextBlock.FontSize="20">
		<TextBlock Text="{Binding Path=Name,StringFormat='{}Name= {0}'}" />
		<TextBlock Text="{Binding Path=AutomationId,StringFormat='{}AutomationId= {0}'}"/>
		<TextBlock Text="{Binding Path=FrameworkId,StringFormat='{}FrameworkId={0}'}"/>
	</StackPanel>
</Window>
using System;
using System.Windows;

namespace WpfApplication1
{
    // "%windir%\system32\UIAutomationCore.dllをtlbimpでInterop.UIAutomationCore.dllを作って参照しておく(埋め込まない)
    // tlbimp "%windir%\system32\UIAutomationCore.dll" /out:Interop.UIAutomationCore.dll

    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = model;
        }

        Model model = new Model();
    }

    class Model : System.ComponentModel.INotifyPropertyChanged , IDisposable
    {
        public Model()
        {
            this.sink = new Sink();
            this.sink.Focused += sink_Focused;
            automation = new Interop.UIAutomationCore.CUIAutomation();

            automation.AddFocusChangedEventHandler(null, this.sink);
        }

        void sink_Focused(object sender, Model.FocusedEventArgs e)
        {
            object oName = e.Element.GetCurrentPropertyValue(Interop.UIAutomationCore.UIA_PropertyIds.UIA_NamePropertyId);
            object oAID = e.Element.GetCurrentPropertyValue(Interop.UIAutomationCore.UIA_PropertyIds.UIA_AutomationIdPropertyId);
            object oFID = e.Element.GetCurrentPropertyValue(Interop.UIAutomationCore.UIA_PropertyIds.UIA_FrameworkIdPropertyId);

            this.Name = oName==null ? "" :  oName.ToString();
            this.AutomationId = oAID == null ? "" : oAID.ToString();
            this.FrameworkId = oFID == null ? "" : oFID.ToString();

            Console.WriteLine("{0},{1},{2}", oName, oAID, oFID);
        }

        private Interop.UIAutomationCore.IUIAutomation automation;
        private Sink sink;

        class Sink : Interop.UIAutomationCore.IUIAutomationFocusChangedEventHandler
        {
            public event EventHandler<FocusedEventArgs> Focused;

            public void HandleFocusChangedEvent(Interop.UIAutomationCore.IUIAutomationElement sender)
            {
                var f = Focused;
                if (f != null)
                {
                    f(this, new FocusedEventArgs() { Element = sender });
                }
                System.Runtime.InteropServices.Marshal.ReleaseComObject(sender);
            }
        }

        class FocusedEventArgs : EventArgs
        {
            public Interop.UIAutomationCore.IUIAutomationElement Element { get; set; }
        }

        public string Name
        {
            get { return _Name; }
            set { _Name = value; OnPropertyChanged("Name"); }
        }
        private string _Name;

        public string AutomationId
        {
            get { return _AutomationId; }
            set { _AutomationId = value; OnPropertyChanged("AutomationId"); }
        }
        private string _AutomationId;

        public string FrameworkId
        {
            get { return _FrameworkId; }
            set { _FrameworkId = value; OnPropertyChanged("FrameworkId"); }
        }
        private string _FrameworkId;

        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string name)
        {
            var pc = PropertyChanged;
            if (pc != null)
            {
                pc(this, new System.ComponentModel.PropertyChangedEventArgs(name));
            }
        }

        public void Dispose()
        {
            if (sink != null && automation != null)
            {
                automation.RemoveFocusChangedEventHandler(sink);
                sink = null;
            }
            if (automation != null)
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(automation);
                automation = null;
            }
        }
    }
}


kit4656 on Fri, 31 Aug 2018 01:02:10


gekkaさん、回答、有難う御座います。

回答して頂いた方法でやりたい事が出来ました。

本当に有難う御座います。