WPF UI オートメーション-スピンコントロール1

Connect IQのシミュレーターの中で、スピンコントロールを使っていたものの一部でUIオートメーションがそのままでは使えなかった。

UIオートメーションでスピンコントロールの設定値を変更するには、RangeValuePatternを取り出し、SetValueで値を設定するのが正統なやり方。

利用できなかったのは、以下のもの(バッテリーの容量を設定するもの)。


実数を設定するためにテキストエリアとアップダウンコントロールが組み合わされたもの。
こちらの方、RangeValuePatternは持っているのだが最大・最少の範囲指定がおかしく、SetValueで実数の設定ができなかった。

RangeValuePatternで正しく設定できるコントロールは、主に整数値を設定させるものだった。
例としては、以下のようなもの。

画面の構成を見ると、一部違いが見て取れた。
実数を設定させるものと比べ、アップダウンコントロールの位置に違いがある。

実数側はテキストエリアの外側にアップダウンコントロールが配置されていて、整数側はテキストの内側に存在する。

Spy++でウィンドウ情報を見てみると、以下の様になっていた。

  • 実数側
  • 整数側

wxSpinCtrlDoubleというのが入っているのが見える。

どうやら、Connect IQのシミュレーターはwxWidgetsを使って実装されているようだ。
で、wxSpinCtrlDoubleは実数のスピンコントロールを実現するため、何か特殊処理を行っているようで、そのため、RangeValuePatternでの制御ができなかったようだ。
これの原因については、つかむことができなかった。

いろいろ処理方法を試した結果、以下のようなコードでとりあえず値の設定は可能だということが分かった。

static public void SetSpinText(AutomationElement element, string value)
{
    var handle = (int)element.GetCurrentPropertyValue(AutomationElement.NativeWindowHandleProperty);
    var prevHandle = GetWindow((IntPtr)handle, GW_HWNDPREV);
    SetFocus(prevHandle);
    Thread.Sleep(200);
    SendKeys.SendWait(value);
    Thread.Sleep(200);
}

やっている内容は、次のようになる。

  1. AutomationElement(スピン)からウィンドウハンドルを取り出す。
  2. 1のウィンドウの前のウィンドウハンドルを取り出す。
    これがテキスト入力エリアのウィンドウハンドルになるため。
  3. フォーカスを取得する。
  4. 設定したい文字列を設定する。
    一応この前後にスリープを入れておく。
    時々うまくいかないからおまじないみたいなものか。

コメント

タイトルとURLをコピーしました