Shujis1964
@Shujis1964 (Shuji Sunano)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

[C#]AutomationElementを使ってラベルの背景色を取得する方法は有りますか?

解決したいこと

C#でUIオートメーションを使ったコードを記述中です。
他のWinidowフォーム上に配置されたラベルの背景色で現在のステータスを表している箇所が有り、そのステータスを知るためにラベルの背景色を取得したいので色々と頑張っているのですがその方法が見つかりません。

やりたいことは、ラベルの背景色を取得し、色によってif文若しくはswitch分などを使用して処理A,処理Bの様に分岐させて動作を変えると言う物です。

ラベルのクラスはC#で作られているフォームなのでSpy++で見ると
WindowsForms10.STATIC.app.0.141b42a_r14_ad1
となっています。

このクラスの情報取得は結構難しくて、テキストの取得もValuePatternとかからは取得できず
AutomationElement.Current.Name
でしか取得できなかったのですが、背景色に関しては該当するプロパティもわからず、取得方法が見つかっていません。
尚、TextBoxの場合は、以下のコードで問題無く背景色を取得できている様です。

TextBoxの背景色を取得する場合

// 呼び出し側
            Int32? textCollor = MainWindow.GetControlBackCollor(TargrtElement);
            if (textCollor != null)
            {
                textBox2.Text = ((Int32)textCollor).ToString("X8");
                if(textCollor == 0xFFFFFF)
                {
                      // 処理A
                }
                else
                {
                      // 処理B
                }
            }


        public Int32? GetControlBackCollor(AutomationElement targetElement)
        {
            if (targetElement == null) return null;
            object patternObj;
            if (targetElement.TryGetCurrentPattern(TextPattern.Pattern, out patternObj))
                                    // 上記はTextだがラベルでは使えない。ValuPatternも認識しない。
            {
                var textPattern = (TextPattern)patternObj;
                Int32 oAttribute = (Int32)(textPattern.DocumentRange.GetAttributeValue(TextPattern.BackgroundColorAttribute));
                                    // ここに記述するはずのラベルのプロパティが書けない。
                return oAttribute;
            }
            else
            {
                return null;
            }
        }

同じようにラベルコントロールに関しても背景色を取得したいので該当するPattern等やAutomationElementのプロパティなど探したのですが
確認出来ず、実現できていません。
そもそもAutomationEementからの背景色取得は出来ないものなのでしょうか?
又はこれに変わる良い方法は有りますでしょうか?

ラベルのプロパティ取得は中々難しく、ご存じの方がいましたらご教授の程よろしくお願いします。

0

1Answer

UIオートメーションでは、背景色を取得できないと思われます。
Inspect.exeで確認できる情報が、UIオートメーションで取得可能な情報と思われるので…
%ProgramFiles(x86)%\Windows Kits<major_version>\bin<version><platform>\inspect.exe

WPFのようなコントロールでは、「背景色」という概念がないので、UIオートメーションでサポートされることは今後も無いと思われます(背景に、画像やグラデーションブラシ等を指定できるため、単一色として取得するのは無理がある)。

Control.FromHandle()では、別プロセスのオブジェクトにアクセスできないので、簡単では無さそうです。

技術的な情報は未確認ですが、以下のツールでは実現できているようですので、参考にしてみてはいかがでしょうか?
おそらく、他プロセスにアクセスするために、デバッガをアタッチしているのでは?と推測しております。

Deliver The Power Of Spy++ To Windows Forms With Our New Tool
ManagedSpy(上記オリジナルバージョンはリンク切れ。GitHubのフォーク版)

[.NET] 便利な実行時インスペクションツール(フリー/オープンソース)~丸見え&診断、動的変更も~ ※掘り出し物あり

1つ目の「ManagedSpy」は、私の環境ではビルドエラーも発生し、修正しても動作できませんでした。
2つ目で紹介されている「HawkEye2」は、ビルドもでき、動作も確認できました。

ご参考になれば幸いです。

0Like

Your answer might help someone💌