2009-04-17 12 views
1

私は、さまざまなUser32.dllライブラリ呼び出しを使用して開いているアプリケーションウィンドウをランダムにクリックする自動テスト用のプログラムをコーディングしています。私の現在の問題は、クリックがダイアログを開くと、Process.WaitForInputIdle()を使用してそのダイアログが次回ループの周りで検出されるのを待たずに、何回かクリックすると、私が避けたいダイアログの中に何かを置いて(終了ボタンを言う)、それを事前に伝える方法はありません。私の質問はこれです。プロセスやスレッドがすべての処理を終了するのを待つ方法はありますか?そして、メッセージループでのみ再び待機していますか?自動クリックの問題

私はそれが理に適ったと思います。

乾杯

ロス

これを失敗EDIT

、両方に、プロセス/ターゲットプログラムのスレッドと私のプログラムを設定して何とかことが可能であろうが同じプロセッサを使用してprioritorysを調整しますターゲットプログラムが優先されるようにそれぞれの

答えて

0

これは、mouse_event APIまたはSendInput APIの代わりにSendMessage APIを使用する方法です。この理由は、SendMessageが処理されるまでブロックされるからです。単にウィンドウのハンドルを(WindowFromPointを使用して)クリックし、ScreenToClientを使用して画面からクライアント座標に変換する場所のすぐ下に置くようにしてください。 ((pt.Y < < 16)+ pt.X)を使用して座標をlParamパラメーターにパックします。これは処理されるまでブロックされ、表示されているモーダルダイアログはこの呼び出しをブロックします。

+0

この方法には、送信されたメッセージに対する応答が最高でも一貫性がないという欠点があります。例えば、WM_NCLBUTTONDOWN/UPでこのメソッドを使用してメモ帳のファイルメニューをクリックしようとすると、実際にメニューを表示せずにメニューループが開始され、immediatlyで終了します。 – Ross

1

WaitForInputIdleは残念ながら、入力メッセージの待機中でないアプリケーションがメッセージループに入ったらすぐに戻ります。

ダイアログのコードを所有している場合は、テストの準備ができていることをオートメーションに知らせるために、ダイアログのSetEventをWM_INITDIALOGに呼び出すことができます。また、プロセス上でSetWinEventHookを使用して、入力イベントを送信する前にダイアログが実際に作成されるまで待つこともできます。

+0

あなたのご意見ありがとうございます。私が書いているプログラムは、かなり一般的なサルテスターであり、特定のプログラムではありません。このように、アクションの結果としてダイアログが表示されるかどうかは事前には分かりません。アイドル状態になるプロセスを検出できるフックがあれば理想的です。 – Ross

関連する問題