WindowsFormsApplicationBase.OpenFormsとForm.ShowInT
投稿者 るきお  (社会人)
投稿日時
2023/12/16 09:40:44
実際にどのようにプログラムしているか教えてください。
投稿内容をヒントに試しに下記のようなプログラムを作ってみましたが、おっしゃるような現象は起きていないように見えます。
このプログラムは Form2を非表示にして、3秒後にForm2を再表示して、My.Application.OpenForms を調べてそのForm2が含まれていることを確認できました。
実際に試すにはForm1で、Button1をクリックして、Form2を表示した後、Form2を右上の×ボタンで閉じて、3秒待ってください。
Debug.WriteLineで出力したメッセージは 出力ウィンドウで確認できます。
https://www.umayadia.com/Note/Note021DebugWriteLine.htm
私の環境(Windows 11 + VB + .NET Framework 4.8)で実行すると次のように出力されました。
ShowInTaskbar = Trueより前 OpenFroms内にありません。
ShowInTaskbar = Trueより後 OpenFroms内にあります。
2
Form1側
Form2側
投稿内容をヒントに試しに下記のようなプログラムを作ってみましたが、おっしゃるような現象は起きていないように見えます。
このプログラムは Form2を非表示にして、3秒後にForm2を再表示して、My.Application.OpenForms を調べてそのForm2が含まれていることを確認できました。
実際に試すにはForm1で、Button1をクリックして、Form2を表示した後、Form2を右上の×ボタンで閉じて、3秒待ってください。
Debug.WriteLineで出力したメッセージは 出力ウィンドウで確認できます。
https://www.umayadia.com/Note/Note021DebugWriteLine.htm
私の環境(Windows 11 + VB + .NET Framework 4.8)で実行すると次のように出力されました。
ShowInTaskbar = Trueより前 OpenFroms内にありません。
ShowInTaskbar = Trueより後 OpenFroms内にあります。
2
Form1側
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim f As New Form2
f.Show()
End Sub
End Class
Form2側
Public Class Form2
Private Async Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
e.Cancel = True
Me.WindowState = FormWindowState.Minimized
Me.ShowInTaskbar = False
Me.Hide()
Await Task.Delay(3000)
Me.WindowState = FormWindowState.Normal
If My.Application.OpenForms.OfType(Of Form).Contains(Me) Then
Debug.WriteLine("ShowInTaskbar = Trueより前 OpenFroms内にあります。")
Else
Debug.WriteLine("ShowInTaskbar = Trueより前 OpenFroms内にありません。")
End If
Me.ShowInTaskbar = True
Me.Show()
If My.Application.OpenForms.OfType(Of Form).Contains(Me) Then
Debug.WriteLine("ShowInTaskbar = Trueより後 OpenFroms内にあります。")
Else
Debug.WriteLine("ShowInTaskbar = Trueより後 OpenFroms内にありません。")
End If
Debug.WriteLine(My.Application.OpenForms.Count)
End Sub
End Class
フォームを表示した状態から閉じるときにCloseをCancelし、
WindowStateをMinimized
ShowInTaskbarをFalse
Formを.Hide
としてバックグラウンドで稼働させたままにしています。
その後、タスクバーなどから再度フォーム表示させるために
WindowStateをNormal
ShowInTaskbarをTrue
Formを.Show
として表示しています。
その後、同フォームの処理で
WindowsFormsApplicationBase.OpenForms
で開いているフォームを取得すると
フォームが開いているにも関わらず
OpenForms内のフォームがない状態になります。
(OpenForms.Count=0)
確認したところ
ShowInTaskbar=True
の処理の前はOpenForms内には開いてるFormが入っており、
処理後にOpenForms内が空になっています。
何故か、ShowInTaskbar=Trueのあとに
Form.Hideをしたあと
Form.Showすると
その時ShowしたFormはOpenForms内に入ります。
(その他のフォームが開いていた場合でもShowしたFormのみがOpenForms内に入ります。
現状、フォーム(Form1)内にフォーム(Form2)を表示しており上記処理ではForm1のみOpenForms内に入ります。)
原因、解決策、対策わかる方おりますでしょうか?
ド素人のため、いろいろ調べましたが原因等が見つかりませんでした。
よろしくお願いします。