@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Debug実行とRelease版exeファイルからの実行で、画面最前面表示の動作が異なる

1
投稿者投稿内容
00_Number
常連さん
会議室デビュー日: 2003/11/04
投稿数: 37
投稿日時: 2004-06-12 17:50
いつもお世話になっております。

現在開いているWindowsform1から別のWindowsform2を開き、Windowsform2が開いている間はWindowsform1はEnabled = False状態で後ろで待機させ、Windowsform2を閉じるとWindowsform1がEnabled = True状態に戻り画面上の最前面に表示されて選択状態になる、という動作を実現したいと考え以下のソースを書きました。


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim searchThread As System.Threading.Thread

' フォームを使用不可
Me.Enabled = False
' 別のexeを起動するスレッドを実行
searchThread = New System.Threading.Thread( _
New System.Threading.ThreadStart( _
AddressOf SearchThread_PriS))

searchThread.Start()

' スレッドが終了するまで待機
While (searchThread.IsAlive)
Application.DoEvents()
End While

' フォームを使用可能
Me.Enabled = True

Me.Activate()

Me.SetStyle(ControlStyles.Selectable, True)

End Sub

Private Sub SearchThread_PriS()
Dim p As Process = New Process
Try
With p

' 別のexeを起動
.StartInfo.FileName = "Windowsform2.exe"
.Start()
' プロセスが終了するまで待機
.WaitForExit()
End With
Catch ex As Exception
' エラーメッセージ
MessageBox.Show("起動しっぱい")
End Try
End Sub


こちらのソースで先に書きました実現したい動作をDebugVS.NETからのデバッグ実行からでは実現する事が出来たのですが、Release版でリビルドしたexeファイルから実行した途端にWindowsForm2を閉じた後のWindowsForm1の処理が「画面上の最前面に表示されず、選択状態にならなく」なってしまいました。
こちらの現象が発生する時は必ず別のウィンドゥが最前面に表示されて選択状態になっています。(例えばWinddowsForm1とInternetExplorerを開いた状態でWindowsForm2を開いて閉じると、InternetExplorerが最前面におり選択状態になっています)

またこちらの現象は複数台のPCで現象を確認したところ、発生する事もあるし、しない事もあるなど、発生条件がはっきりせずに原因の究明と解決方法が分からずに困っております。

どなたか解決方法等ご存知でしたら教えて頂きたい思います。

[ メッセージ編集済み 編集者: 00_Number 編集日時 2004-06-12 17:50 ]
hogehoge
会議室デビュー日: 2004/05/24
投稿数: 8
投稿日時: 2004-06-16 16:29
確認したところ同じ状態になりました。
そこで、

Process process = new Process();
this.Enabled = false;
process.StartInfo.FileName = "Form2.exe";
process.Start();
process.WaitForExit();
this.TopMost = true;
this.Enabled = true;
this.Activate();
this.TopMost = false;

TopMostプロパティを一回trueすることで、回避できました。
C#ですいません。
VBにTopMostがある事を確認してないのですが。。。
00_Number
常連さん
会議室デビュー日: 2003/11/04
投稿数: 37
投稿日時: 2004-06-21 18:57
hogehogeさん、ご解答ありがとうございます。

教えて頂いた方法を実は自分も試してみたのですが、どうにもうまくいきませんでした。

最終的にはWindowsform2が閉じる直前にAPI関数のSetForegroundWindowでWindowsform1を最前面に表示するという方法で解決しました。
1

スキルアップ/キャリアアップ(JOB@IT)