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

他のアプリケーションを起動し終わったら元のフォームをアクティブにしたい

環境/言語:[XP VB.NET]
分類:[.NET]

2005/04/13(Wed) 17:52:12 編集(投稿者)

初めて投稿させていただきます。
私は、VB.NETでWindowsフォームを作成しているプログラマーです。

TEST1.exeからTEST2.exeを呼び出してTEST2が終わるまで待機し、
終わったらTEST1をアクティブにしたいのですが、
TEST1.exeを起動するために開いたエクスプローラーが
アクティブになってしまいます。

ただ、ソースから実行した場合はきちんとTEST1がアクティブになります。

http://dobon.net/vb/bbs/log3-6/3238.html
を参考にさせていただいたのですが、何か実行ファイルだといけない
ということがあるのでしょうか?
ちなみにEXEを作成する時にはReleaseにしています。

ご返答のほどよろしくお願いいたします。

以下にこのソースの記述を載せさせていただきます。
-------------------------------------------------
Private Sub Button1_Click(・・・・) Handles Button1.Click
lblMsg.Text = "開始"
Me.Refresh()

'別画面起動
Dim subthread As System.Threading.Thread = Nothing
Me.Enabled = False
'起動するためのスレッドを実行
subthread = New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf ThreadSub))
subthread.Start()
'スレッドが終了するまで待機
While (subthread.IsAlive)
Application.DoEvents()
End While
Me.Enabled = True
Me.Activate()

lblMsg.Text = "終了"
Me.Refresh()
End Sub
-------------------------------------------------
Private Sub ThreadSub()
Dim proc As Process = New Process
'別画面を起動
With proc.StartInfo
.FileName = "c:\work\TEST2.exe"
.Arguments = "1"
.WindowStyle = ProcessWindowStyle.Normal
End With
proc.Start()
'入力画面のプロセスが終了するまで待機
proc.WaitForExit()
End Sub
2005/04/13(Wed) 13:40:35 編集(投稿者)

こんにちは、じゃんぬ です。

■No10379に返信(なおみさんの記事)
> 以下にこのソースの記述を載せさせていただきます。

何故、スレッド (System.Threading.Thread のこと) を建てる必要があるんですか?

参考にしたのならば、もっとじっくり見ては?
http://dobon.net/vb/bbs/log3-6/3238.html



// 微妙に誤解されそうだったので訂正
2005/04/13(Wed) 17:54:05 編集(投稿者)

じゃんぬさん返信ありがとうございます。

> 何故、スレッド (System.Threading.Thread のこと) を建てる必要があるんですか?
>
> 参考にしたのならば、もっとじっくり見ては?
> http://dobon.net/vb/bbs/log3-6/3238.html

おっしゃるとおりです。申し訳ありません。m(_ _)m
別のサイトからアプリケーションの起動部分を参考にして、呼び出し元がアクティブにならない点(Form.Activate()を呼び出すことでフォームをアクティブにすることができると思います。)というところだけを見ていました。
ご指摘ありがとうございます。

そこでスレッドはやめて以下のようにしてみましたが、やはり実行ファイルから
だと呼び出し元がアクティブにはなりませんでした。

この未熟者に助言頂ければ幸いです。よろしくお願いいたします。

Private Sub Button1_Click(・・・・) Handles Button1.Click
lblMsg.Text = "開始"
Me.Refresh()

Dim proc As Process = New Process
'印刷画面を起動
With proc.StartInfo
.FileName = "c:\work\TEST2.exe"
.Arguments = "9"
.WindowStyle = ProcessWindowStyle.Normal
End With
proc.Start()
'入力画面のプロセスが終了するまで待機
proc.WaitForExit()

Me.Enabled = True
Me.Activate()

lblMsg.Text = "終了"
Me.Refresh()
End Sub
2005/04/13(Wed) 14:48:53 編集(投稿者)

こんにちは、じゃんぬ です。

■No10383に返信(なおみさんの記事)
> そこでスレッドはやめて以下のようにしてみましたが、
> やはり実行ファイルからだと呼び出し元がアクティブにはなりませんでした。

いえ、Me.Activate() メソッドの時点でアクティブにはなっているでしょう。
ですが、アクティブになるのと、最前面に表示されるのは別問題ですよね?

Me.Activate() メソッドのあとに、Me.BringToFront() メソッドを追加してみてください。
こちらでは、正しく動作しました。
2005/04/13(Wed) 15:01:40 編集(投稿者)

じゃんぬさん返信ありがとうございます。

まずは、結果から報告したしますと、私の思っていたとおり動作いたしました。
本当にありがとうございました。

以下はお詫びです。

>いえ、Me.Activate() メソッドの時点でアクティブにはなっているでしょう。
>ですが、アクティブになるのと、最前面に表示されるのは別問題ですよね?
>Me.Activate() メソッドのあとに、Me.BringToFront() メソッドを追加してみてください。

はい。アクティブになっていました。
最前面にと記述しないといけなかったのだと、ご指摘を受けて初めて気づきました。
本当にすみません。こんな記述で私の意図を悟っていただき、的確な指示をありがとうございます。
これからはもっときちんと調べ、記述も的確にしたいと思いますので、
どうぞこれからもよろしくお願いいたします。
解決済み!

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