10

UI オートメーションを学んでいますが、「オブジェクトの検査」クローンがIsKeyboardFocusabletrue の場合でも常に false を示していることがわかりました。他のすべての情報は同じです (画像からわかるように)。値を取得したときにこのプロパティが false と表示される理由を誰か知っていますか?

ここに画像の説明を入力

4

3 に答える 3

3

IsKeyboardFocusable の内部実装は GetCurrentPropertyValue(property: AutomationElement.IsKeyboardFocusableProperty, ignoreDefaultValue: false) 関数を使用します。失敗した場合は、false を返すだけです (そして、あなたの場合は失敗します)。したがって、IsKeyboardFocusable の代わりに GetCurrentPropertyValue(property: AutomationElement.IsKeyboardFocusableProperty, ignoreDefaultValue: true) を使用することをお勧めします。これにより、失敗したかどうかがわかります。

winapi を使用すると、Inspect とまったく同じ結果を得ることができます。Olecc.dll は IAccessibleインターフェイスを提供します(このインターフェイスの詳細な説明があります)。そのインターフェースのインスタンスは子インスタンスを持つことができ、それらの一部はフォーカス可能であり、それらの一部ではありません。HWnd から IAccessible を作成する場合、コントロール全体がフォーカス可能かどうかを確認できません。確かに、画面のポイントから IAccessible を作成する必要があります-それにより、そのポイントの下にある IAccessible が正確に得られます(スクリーンショットで、Inspect が画面上のポイントを使用していることがわかります-「How found - Mouse move (1120, 470)」 )。また、Inspect で UIAutomation モードから MSAA モードに切り替えると、IAccessible がどのように見えるかを確認できます。

ただし、可能であれば、UIAutomation の代替実装を使用することをお勧めします。正しい IsKeyboardFocusable 値を返します (標準の UIAutomation 実装とは異なります)。私はこのライブラリを自分でテストしませんでしたが (IsKeyboardFocusable のみをテストしました)、正常に動作し、標準実装と同じ型とインターフェイスを備えているようです。IAccessible の場合と同様に、HWnd からではなく、ポイントから AutomationElement を作成する必要があります。

あなたの質問について - 標準の UIAutomation が AutomationElement.IsKeyboardFocusableProperty を正確に返せない場合がある理由はまだわかりません。多分バグだと思います。

于 2013-06-25T16:40:16.643 に答える