DOBON.NET DOBON.NETプログラミング掲示板過去ログ

waitのかけ方

  • 題名: waitのかけ方
  • 著者: 馬三郎
  • 日時: 2005/07/16 21:56:32
  • ID: 11839
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[winxp sp2 VB.NET]
分類:[.NET]

いつも参考にさせていただいております。
今回、どうしてもうまくいかないので、
ご存知の方がいたら教えてください。

現在、外部アプリを起動して処理を行わせるプログラムを書いておりますが、
どうしてもうまくいきません。

↓ソース
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim File_PATH As String = "E:\Program Files\A.EXE"
Shell(File_PATH)
'アプリの起動を待つ。
System.Threading.Thread.Sleep(2000)

SendKeys.Send("%(z)")
SendKeys.Send("{DOWN 15}")
    '外部アプリ内で新しいウインドが表示される。
SendKeys.Send("~")
    '新しいウインドの表示を待つ。
    System.Threading.Thread.Sleep(2000)

    ↓ここからうまく動かない。
    SendKeys.Send("TAB")
SendKeys.Send("~")
End Sub

2回目のSystem.Threading.Thread.Sleep(2000)が
うまく働いていないように見えていて、
新しいウインドが表示される前に
SendKeys.Send("TAB")
が実行されてしまいます。
また、2回目のSystem.Threading.Thread.Sleep(2000)を
書くことによって、
SendKeys.Send("%(z)")
を実行開始する時間も長くなったように感じます。
System.Threading.Thread.Sleepの使い方が
間違っているのでしょうか。

どうか教えてください。
アプリの起動を待つときは、Sleepを使うべきではありません。
System.DiagnosticsProcess.Start()で起動し、
System.DiagnosticsProcess.WaitForInputIdle()
で起動するまで待機してください。

ウインドウの表示を待つときも、
System.DiagnosticsProcess.WaitForInputIdle()
で待機します。
■No11841に返信(KJさんの記事)
KJさん、ありがとうございます。

Dim File_Path As String = "E:\Program Files\A.EXE"
Dim myProcess As New Process
myProcess.StartInfo.FileName = File_Path
myProcess.Start()
myProcess.WaitForInputIdle()
SendKeys.Send("%(z)")
SendKeys.Send("{DOWN 15}")
'外部アプリ内で新しいウインドが表示される。
SendKeys.Send("~")

    ↓ここからうまくいかない。
myProcess.WaitForInputIdle()
SendKeys.Send("{TAB 2}")
やはり、2回目のmyProcess.WaitForInputIdle()の部分でうまくいきません。
ほかの方法があれば教えてください。
こんにちは、じゃんぬ です。

■No11843に返信(馬三郎さんの記事)
> やはり、2回目のmyProcess.WaitForInputIdle()の部分でうまくいきません。
> ほかの方法があれば教えてください。

プロセスが既にアイドル状態なのですから、当たり前です。(^^)
(1回目の WaitForInputIdle が何たるかをお考えください)
  • 題名: Re[4]: waitのかけ方
  • 著者: 馬三郎
  • 日時: 2005/07/23 23:38:12
  • ID: 11935
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
返事が遅くなり申し訳ありません。

Dim File_Path As String = "E:\Program Files\A.EXE"
Dim myProcess As New Process
myProcess.StartInfo.FileName = File_Path
myProcess.Start()
myProcess.WaitForInputIdle()
SendKeys.Send("%(z)")
System.Threading.Thread.Sleep(1000)
SendKeys.Send("{DOWN 15}")
System.Threading.Thread.Sleep(1000)
'外部アプリ内で新しいウインドが表示される。
SendKeys.Send("~")
System.Threading.Thread.Sleep(1000)
SendKeys.Send("{TAB}")
System.Threading.Thread.Sleep(1000)
SendKeys.Send("{TAB}")

このようにしたらうまく動作しました。
なんかコード的には正しくないように思いますが、
なんとか動いています。
もう少しいろいろと研究してみようと思います。
ありがとうございました。。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板