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);
}
やっている内容は、次のようになる。
- AutomationElement(スピン)からウィンドウハンドルを取り出す。
- 1のウィンドウの前のウィンドウハンドルを取り出す。
これがテキスト入力エリアのウィンドウハンドルになるため。 - フォーカスを取得する。
- 設定したい文字列を設定する。
一応この前後にスリープを入れておく。
時々うまくいかないからおまじないみたいなものか。
コメント