UIオートメーションを学習していて、「検査オブジェクト」のクローンが真であるにもかかわらずIsKeyboardFocusable
が常にfalseであることがわかりました。イメージから見ることができます)。値を取得するときに、なぜこのプロパティがfalseと表示されるのか誰にもわかりませんか?IsKeyboardFocusableはオブジェクトの検査ではtrueですが、アプリケーションでは常にfalseです
答えて
Inspect Object
アプリケーション内では、これらのプロパティをすべて最新のWindows Automation COM API(3.0)で表示します。しかし、既定の.NET UIAutomation実装は、Windows Automation API 3.0 COMインターフェイス(このCOM APIの以前のバージョンに基づいています)に基づいていません。したがって、一部のプロパティは正しく機能しません。たとえば、Skypeの連絡先リストの場合、AutomationElement.IsKeyboardFocusableProperty
プロパティは、このプロパティの値を取得することはまったくサポートされていないと言います。あなたは次のコードスニペットを使用して、これをチェックすることができます。
object isKeyboardFocusable = listItem.GetCurrentPropertyValue(AutomationElement.IsKeyboardFocusableProperty, true);
if(isKeyboardFocusable == AutomationElement.NotSupported) {
// we will always goes here
}
今、私は現在のネットUIAutomationの実装を使用して、この動作を回避する方法を知りません。
良いニュースは、新しいWindows Automation API 3.0 COMインターフェイスを信頼性とパフォーマンスを向上させ、同じSystem.Windows.Automationを使用して使用できるように、.NETに代替UI Automation実装が存在することです。以前のバージョンのUIオートメーションと同様に、この実装は、CodePlexのプロジェクトとして利用できます。UI Automation COM-to-.NET Adapter
したがって、この代替実装では、IsKeyboardFocusableプロパティがInspect Objects
ツールと同じ結果を返します。さらに、Inspect Objects
が表示するいくつかの拡張プロパティ(例:LegacyAccessibleメンバ)を使用することができます。
IsKeyboardFocusableの内部実装はGetCurrentPropertyValue(プロパティ:AutomationElement.IsKeyboardFocusableProperty、ignoreDefaultValue:false)を使用する機能を。失敗した場合はfalseを返すだけです(あなたの場合は失敗します)。したがって、IsKeyboardFocusableの代わりにGetCurrentPropertyValue(プロパティ:AutomationElement.IsKeyboardFocusableProperty、ignoreDefaultValue:true)を使用することをお勧めします。
winapiを使用すると、Inspectとまったく同じ結果が得られます。 Olecc.dllはIAccessible interfaceを与えます(詳細はdescriptionです)。そのインタフェースのインスタンスは子インスタンスを持つことができ、その一部はフォーカス可能であり、その一部は不可能です。 HWndからIAccessibleを作成した場合、コントロール全体がフォーカス可能かフォーカス不可かを確認することはできません。確かに、あなたは画面からIAccessibleを作成する必要があります - その時点でIAccessibleを正確に表示します(スクリーンショットではInspectが画面上のポイントを使用しています - "How found - マウス移動(1120,470)" )。また、InspectでUIAutomationモードからMSAAに切り替えると、IAccessibleの外観がわかります。
しかし、可能であれば、alternative implementation of UIAutomationを使用することをおすすめします。正しいIsKeyboardFocusable値を返します(標準のUIAutomation実装とは異なります)。私はこのライブラリを自分でテストしなかったが(IsKeyboardFocusableのみをテストした)、うまく動作しているようで、標準の実装と同じタイプとインタフェースを持っているようだ。 IAccessibleの場合と同様に、HWndではなく、ポイントからAutomationElementを作成する必要があります。
あなたの質問について - 私はまだ分かりませんが、標準UIAutomationがAutomationElement.IsKeyboardFocusablePropertyを正確に返すことができないことがあるのはなぜか分かりません。私はバグかもしれないと思う。
* IAccessibleは使用しないでください。これは非常に古いAPIであり、数多くの問題があります(奇妙なCOMインターフェイス、予期しないポイントのブロックなど)。別のUIAutomationバインディングを使用してください。 –
@EricBrown:私は全く同意します。可能であれば、代わりのUIオートメーションを使用する方がよいでしょう。しかし、これがオプションでない場合、標準のUIオートメーションが失敗した場合にのみ、IsKeyBoardFocusableを見つけるために、IAccessibleを使用することができます。 –
Win7のネイティブUIオートメーションプロキシはIAccessibleに戻ります。ただし、クロスプロセスではなくIAccessible * inproc *を使用するため、パフォーマンスが大幅に向上します。実際、IAccessibleを使用する自動化アプリケーションを開発する開発者にとっては、全く理由はありません。 –
このUI自動化スパイツールを試しましたか:https://ddeltasolutions.000webhostapp.com/? IsKeyboardFocusablePropertyが真であるケース、たとえばSkypeアプリケーションのメニューバーが見つかりました。
私はまったく同じ問題を抱えています。 'IsKeyboardFocuseable'がfalseの場合、' SetFocus() 'を呼び出すと例外がスローされるので、これは大きな問題です。 –