WindowControl


クラス概略
Windowの基本的操作と子ウィンドウの取得、特定ができます。
WPFにも対応しています。


GUI要素の特定に関して
GUIのテスト作成の際に困るのが、子要素の特定方法です。
テストを回帰的に実行する場合、毎回同じ方法で特定できなければなりません。
しかし、世の中には様々なウィンドウがあり(動的に生成したり、サイズが変わったり、etc)で、
「この方法なら全てのウィンドウに対して確実」というのは、中々存在しません。
そのため、このクラスでは、複数のウィンドウ特定方法を提供します。
ケースに応じて使い分けてみてください。
ウィンドウの特定方法に関しては、TestAssistantを使用すれば、最適な特定方法を決定のための情報を取得できます。
こちらも合わせてご利用お願いします。
また、とはいえ、ある程度はセオリーもあります。こちらにまとめてみましたので参照お願いします。



public WindowControl(WindowsAppFriend app, IntPtr windowHandle)
解説
コンストラクタです。

引数
app
アプリケーション操作クラスです。
windowHandle
WindowControlで操作する対象のウィンドウハンドルです。



public WindowControl(WindowsAppFriend app, AppVar windowObject)
解説
コンストラクタです。

引数
app
アプリケーション操作クラスです。
windowObject
WindowControlで操作する対象のウィンドウのオブジェクトの格納されたアプリケーション内変数です。



public static WindowControl FromZTop(WindowsAppFriend app)
解説
最前面ウィンドウを操作するWindowControlを取得します。

戻り値
最前面ウィンドウを操作するWindowControl。

引数
app
アプリケーション操作クラスです。



public static WindowControl[] GetTopLevelWindows(WindowsAppFriend app)
解説
対象プロセスの有効な全てのトップレベルウィンドウを取得します。

戻り値
対象プロセスの有効な全てのトップレベルウィンドウのウィンドウ操作クラス。

引数
app
アプリケーション操作クラスです。



public static WindowControl IdentifyFromWindowText(WindowsAppFriend app, string text)
解説
WindowsApiのGetWindowTextで取得した文字列が指定の文字列になる有効なトップレベルウィンドウを特定します。
条件に一致するウィンドウが複数存在する場合は特定に失敗します。

戻り値
ウィンドウ操作クラスです。

引数
app
アプリケーション操作クラスです。
text
ウィンドウテキストです。



public static WindowControl IdentifyFromTypeFullName(WindowsAppFriend app, string typeFullName)
解説
指定の.netタイプフルネームに一致する有効なトップレベルウィンドウを特定します。
条件に一致するウィンドウが複数存在する場合は特定に失敗します。

戻り値
ウィンドウ操作クラスです。

引数
app
アプリケーション操作クラスです。
typeFullName
タイプフルネームです。



 public static WindowControl IdentifyFromWindowClass(WindowsAppFriend app, string className)
解説
ウィンドウクラス名称に一致する有効なトップレベルウィンドウを特定します。
条件に一致するウィンドウが複数存在する場合は特定に失敗します。

戻り値
ウィンドウ操作クラスです。

引数
app
アプリケーション操作クラスです。
className
ウィンドウクラス名称。



public static WindowControl WaitForIdentifyFromWindowText(WindowsAppFriend app, string text)
解説
WindowsApiのGetWindowTextで取得した文字列が指定の文字列になる有効なトップレベルウィンドウを特定するまで待ちます。

戻り値
ウィンドウ操作クラスです。

引数
app
アプリケーション操作クラスです。
text
ウィンドウテキストです。



public static WindowControl WaitForIdentifyFromWindowText(WindowsAppFriend app, string text, Async async)
解説
WindowsApiのGetWindowTextで取得した文字列が指定の文字列になる有効なトップレベルウィンドウを特定するまで待ちます。
ウィンドウを特定前に渡された非同期オブジェクト(async)が操作完了した場合にも終了します。

戻り値
ウィンドウ操作クラスです。

引数
app
アプリケーション操作クラスです。
text
ウィンドウテキストです。
async
非同期実行オブジェクト



public static WindowControl WaitForIdentifyFromTypeFullName(WindowsAppFriend app, string typeFullName)
解説
指定の.netタイプフルネームに一致する有効なトップレベルウィンドウを特定するまで待ちます。

戻り値
ウィンドウ操作クラスです。

引数
app
アプリケーション操作クラスです。
typeFullName
タイプフルネームです。



public static WindowControl WaitForIdentifyFromTypeFullName(WindowsAppFriend app, string typeFullName, Async async)
解説
指定の.netタイプフルネームに一致する有効なトップレベルウィンドウを特定するまで待ちます。
ウィンドウを特定前に渡された非同期オブジェクト(async)が操作完了した場合にも終了します。

戻り値
ウィンドウ操作クラスです。

引数
app
アプリケーション操作クラスです。
typeFullName
タイプフルネームです。
async
非同期実行オブジェクト



 public static WindowControl WaitForIdentifyFromWindowClass(WindowsAppFriend app, string className)
解説
ウィンドウクラス名称に一致する有効なトップレベルウィンドウを特定するまで待ちます。

戻り値
ウィンドウ操作クラスです。

引数
app
アプリケーション操作クラスです。
className
ウィンドウクラス名称。



 public static WindowControl WaitForIdentifyFromWindowClass(WindowsAppFriend app, string className, Async async)
解説
ウィンドウクラス名称に一致する有効なトップレベルウィンドウを特定するまで待ちます。
ウィンドウを特定前に渡された非同期オブジェクト(async)が操作完了した場合にも終了します。

戻り値
ウィンドウ操作クラスです。

引数
app
アプリケーション操作クラスです。
className
ウィンドウクラス名称。
async
非同期実行オブジェクト



public static WindowControl[] GetFromWindowText(WindowsAppFriend app, string text)
解説
指定のウィンドウテキストに一致する有効なトップレベルウィンドウをすべて取得します。

戻り値
指定のウィンドウテキストに一致するウィンドウ操作クラスです。

引数
app
アプリケーション操作クラスです。
text
ウィンドウテキスト。



public static WindowControl[] GetFromTypeFullName(WindowsAppFriend app, string typeFullName)
解説
指定の.netタイプフルネームに一致する有効なトップレベルウィンドウをすべて取得します。

戻り値
指定のタイプフルネームに一致するウィンドウ操作クラスです。

引数
app
アプリケーション操作クラスです。
typeFullName
タイプフルネームです。



public static WindowControl[] GetFromWindowClass(WindowsAppFriend app, string className)
解説
指定のウィンドウクラス名称に一致する有効なトップレベルウィンドウをすべて取得します。

戻り値
指定のウィンドウクラス名称に一致するウィンドウ操作クラスです。

引数
app
アプリケーション操作クラスです。
className
ウィンドウクラス名称。



public WindowsAppFriend App { get; }
解説
アプリケーション操作クラスを取得します。



public IntPtr Handle { get; }
解説
対応するウィンドウハンドルを取得します。



public AppVar AppVar { get; }
解説
対応するウィンドウの.Netのオブジェクトが格納されたAppVarを取得します。
対応するウィンドウが.Netのオブジェクトである場合のみ使用可能です。



public int DialogId  { get; }
解説
ダイアログIDを取得します。



public string WindowClassName { get; }
解説
ウィンドウクラス名称を取得します。



public string TypeFullName { get; }
解説
タイプフルネームを取得します。



public WindowControl ParentWindow  { get; }
解説
親ウィンドウハンドルを取得します。



public bool AutoRefresh  { get; set }
解説
自動リフレッシュ。
既定ではtrueです。
trueの場合子ウィンドウ取得時に自動でRefreshを呼び出し更新します。
falseにすると更新しなくなり、最後に更新した時点のウィンドウツリー構成が保たれます。



public FriendlyOperation this[string operation]{ get; }
public FriendlyOperation this[string operationAsync async]{ get; }
public FriendlyOperation this[string operationOperationTypeInfo operationTypeInfo]{ get; }
public FriendlyOperation this[string operationOperationTypeInfo operationTypeInfo, Async async]{ get; }
解説
テスト対象アプリケーション内の変数の操作を呼び出すdelegateを取得します。
対応するウィンドウが.Netのオブジェクトである場合のみ使用可能です。

戻り値
操作実行delegate。

引数
operation
操作名称です。
operationTypeInfo
操作型情報です。
指定の操作に対して、複数のオーバーロードが存在する場合、もしくは親クラスの同名の操作を呼び出したい場合に使用します。
オーバーロードに関しては多くの場合、OperationTypeInfoを使わずとも、渡す引数で解決できます。
async
非同期実行用オブジェクトです。



public void Refresh()
解説
内部的に保持する子ウィンドウのツリーを更新します。
以降はこの時点の情報に従って、子ウィンドウの取得、特定が可能となります。



public AppVar IdentifyFromLogicalTreeIndex(params int[] logicalTreeIndex)
解説
WPFのウィンドウ用です。
指定のロジカルツリーインデックスに対応するGUI要素を特定します。
ロジカルツリーインデックスはLogicalTreeHelper.GetChildrenの取得順によって決定されます。
TestAssistantを使用すると容易に調べることができます。

戻り値
アプリケーション内変数。

引数
logicalTreeIndex
ロジカルツリーインデックス配列。


public WindowControl IdentifyFromZIndex(params int[] zindex)
解説
指定のZ順の子ウィンドウを特定します。
Z順のソートにはWindowsApiのGetWindowが用いられています。
MFCのダイアログの場合、逆順で取得されるので気を付けてください。
zインデックスはTestAssistantを使用すると容易に調べることができます。

戻り値
ウィンドウ操作クラス。

引数
zindex
zインデックス配列。



public WindowControl IdentifyFromWindowText(string text)
解説
WindowsApiのGetWindowTextで取得した文字列が指定の文字列になるウィンドウを特定します。
条件に一致するウィンドウが複数存在する場合は特定に失敗します。
ウィンドウテキストはTestAssistantを使用すると容易に調べることができます。

戻り値
ウィンドウテキスト。

引数
text
ウィンドウテキスト。



public WindowControl IdentifyFromBounds(int x, int y, int width, int height)
解説
指定の矩形に一致するウィンドウを特定します。
条件に一致するウィンドウが複数存在する場合は特定に失敗します。
矩形はTestAssistantを使用すると容易に調べることができます。

戻り値
アプリケーション内変数。

引数
x
x座標。
y
y座標。
width
幅。
height
高さ。



public AppVar IdentifyFromTypeFullName(string typeFullName)
解説
指定の.netタイプフルネームに一致するウィンドウを特定します。
条件に一致するウィンドウが複数存在する場合は特定に失敗します。
タイプフルネームはTestAssistantを使用すると容易に調べることができます。

戻り値
アプリケーション内変数。

引数
typeFullName
.netのタイプフルネーム。



public WindowControl IdentifyFromWindowClass(string className)
解説
ウィンドウクラス名称に一致するウィンドウを特定します。
条件に一致するウィンドウが複数存在する場合は特定に失敗します。
ウィンドウクラス名称はTestAssistantを使用すると容易に調べることができます。

戻り値
ウィンドウ操作クラス。

引数
className
ウィンドウクラス名称。



public WindowControl IdentifyFromDialogId(params int[] id)
解説
指定のダイアログIDに一致するウィンドウを特定します。
ダイアログIDはTestAssistantを使用すると容易に調べることができます。

戻り値
ウィンドウ操作クラス。

引数
id
ダイアログID。
入れ子になったダイアログ構造の場合、連続してIDを指定することができます。



public WindowControl[] GetFromWindowText(string text)
解説
指定のウィンドウテキストに一致するウィンドウをすべて取得します。

戻り値
ウィンドウ操作クラス。

引数
text
ウィンドウテキスト



public WindowControl[] GetFromBounds(int x, int y, int width, int height)
解説
指定の矩形に一致するウィンドウをすべて取得します。

戻り値
ウィンドウ操作クラス。

引数
x
x座標。
y
y座標。
width
幅。
height
高さ。



public AppVar[] GetFromTypeFullName(string typeFullName)
解説
指定の.netタイプフルネームに一致するウィンドウをすべて取得します。

戻り値
アプリケーション内変数。

引数
typeFullName
.netのタイプフルネーム。



public WindowControl[] GetFromWindowClass(string className)
解説
指定のウィンドウクラス名称に一致するウィンドウをすべて取得します。

戻り値
ウィンドウ操作クラス。

引数
className
ウィンドウクラス名称。



public WindowControl WaitForNextZTop()
解説
現在非推奨です。
モーダレスウィンドウが複数枚表示されている場合の動作が誤解を招く恐れがあるので非推奨とさせていただきます。
次のいずれかを使用してください。WaitForNextModal, WaitForIdentifyFromWindowText, WaitForIdentifyFromTypeFullName, WaitForIdentifyFromWindowClass。
自身を除くウィンドウがアプリケーション内で最前面になるのを待ちます。
モーダルダイアログ表示など画面が表示される処理を非同期で呼び出した場合に、次の画面が表示されるまで同期をとるのに使用します。

戻り値
ウィンドウ操作クラス。



public WindowControl WaitForNextZTop(Async async)
解説
現在非推奨です。
モーダレスウィンドウが複数枚表示されている場合の動作が誤解を招く恐れがあるので非推奨とさせていただきます。
次のいずれかを使用してください。WaitForNextModal, WaitForIdentifyFromWindowText, WaitForIdentifyFromTypeFullName, WaitForIdentifyFromWindowClass。
自身を除くウィンドウがアプリケーション内で最前面になるのを待ちます。
モーダルダイアログ表示など画面が表示される処理を非同期で呼び出した場合に、次の画面が表示されるまで同期をとるのに使用します。
また、次の最前面ウィンドウが表示されるまでに渡された非同期オブジェクト(async)が操作完了した場合にも終了します。

戻り値
ウィンドウ操作クラス。
次の最前面ウィンドウが表示されるまでに渡された非同期オブジェクトが操作完了した場合はnullを返します。

引数
async
非同期オブジェクト。
通常は、画面を表示させるトリガとなる処理を非同期呼び出しするのに使ったasyncを渡します。




public WindowControl WaitForNextModal()
解説
モーダルダイアログ表示が表示される処理を非同期で呼び出した場合に、次の画面が表示されるまで同期をとるのに使用します。
自身のウィンドウがDisable状態になり、別のウィンドウがアプリケーション内でただ一つの有効状態で可視状態のトップレベルウィンドウになった場合それを返します。

戻り値
ウィンドウ操作クラス。



public WindowControl WaitForNextModal(Async async)
解説
モーダルダイアログ表示が表示される処理を非同期で呼び出した場合に、次の画面が表示されるまで同期をとるのに使用します。
自身のウィンドウがDisable状態になり、別のウィンドウがアプリケーション内でただ一つの有効状態で可視状態のトップレベルウィンドウになった場合それを返します。
また、次の最前面ウィンドウが表示されるまでに渡された非同期オブジェクト(async)が操作完了した場合にも終了します。

戻り値
ウィンドウ操作クラス。
次の最前面ウィンドウが表示されるまでに渡された非同期オブジェクトが操作完了した場合はnullを返します。

引数
async
非同期オブジェクト。
通常は、画面を表示させるトリガとなる処理を非同期呼び出しするのに使ったasyncを渡します。



public void WaitForDestroy()
解説
ウィンドウが破棄されるのを待ちます。



public void WaitForDestroy(Async async)
解説
ウィンドウが破棄されるのを待ちます。
また、次の最前面ウィンドウが表示されるまでに渡された非同期オブジェクト(async)が操作完了した場合にも終了します。

引数
async
非同期オブジェクト。
通常は、画面を表示させるトリガとなる処理を非同期呼び出しするのに使ったasyncを渡します。



public void SetWindowText(string text)
解説
ウィンドウテキストの設定。
対象アプリケーションの操作対象スレッドで実行されます。

引数
text
設定するテキスト。



public string GetWindowText()
解説
ウィンドウテキストの取得。
対象アプリケーションの操作対象スレッドで実行されます。

戻り値
ウィンドウテキスト。



public IntPtr SetFocus()
解説
フォーカスの設定。
対象アプリケーションの操作対象スレッドで実行されます。

戻り値
設定前にフォーカスを持っていたウィンドウのハンドル。



public IntPtr SendMessage(int message, IntPtr wparam, IntPtr lparam)
解説
メッセージ送信。
対象アプリケーションの操作対象スレッドで実行されます。

戻り値
結果。

引数
message
メッセージ。
wparam
wparam。
lparam
lparam。



public AppVar SendMessage(int message, IntPtr wparam, IntPtr lparam, Async async)
解説
メッセージ送信。
対象アプリケーションの操作対象スレッドで実行されます。
PostMessageは失敗する場合があるので、あくまでSendMessageを非同期で実行します。

戻り値
結果。

引数
message
メッセージ。
wparam
wparam。
lparam
lparam。
async
非同期オブジェクト。



public void SequentialMessage(params MessageInfo[] info)
解説
対象アプリケーションの実行対象スレッドで、連続でSendMessageを呼び出します。

引数
info
メッセージ情報配列。



public void SequentialMessage(Async async, params MessageInfo[] info)
解説
対象アプリケーションの実行対象スレッドで、連続でSendMessageを呼び出します。
非同期で実行します。

引数
info
メッセージ情報配列。
async
非同期オブジェクト。