WindowsFormsApplicationBase.OpenFormsとForm.ShowInT

タグの編集
投稿者 Tさん  (社会人) 投稿日時 2023/12/15 12:48:40
.net Framework 4.8でWindowsフォームアプリを開発しているのですが、下記の事象が起きて困っております。

フォームを表示した状態から閉じるときに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内に入ります。)

原因、解決策、対策わかる方おりますでしょうか?

ド素人のため、いろいろ調べましたが原因等が見つかりませんでした。
よろしくお願いします。
投稿者 るきお  (社会人) 投稿日時 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側
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(MeThen
            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(MeThen
            Debug.WriteLine("ShowInTaskbar = Trueより後 OpenFroms内にあります。")
        Else
            Debug.WriteLine("ShowInTaskbar = Trueより後 OpenFroms内にありません。")
        End If

        Debug.WriteLine(My.Application.OpenForms.Count)
    End Sub
End Class