ところが、VB.NETではMe.Visible = False とやっているにも関わらずなぜか表示してしまう。
Me.RefreshやApplication.DoEventsを付けても全くだめ。Activatedイベント内で非表示にさせようとしても駄目だった。
一度フォームが表示した後でなら、いくらでも非表示にさせられるのに、起動時に非表示にできないのである。
仕方が無いのでTimerコントロールを使いTimerイベント内でMe.Visible=Falseを実行させたところ、一瞬表示された後フォームは消えた。
スマートではないがとりあえず非表示にはなった。だが、やはり納得がいかずもう少し調べてみた。
いろいろ試すうちにフォームデザイン時にShowInTaskbarをFalseにして、WindowStateをMinimized(最小化)にすると表示しないことが判明。
大事なのは実行時に指定しても無駄で、必ずデザイン時にこうしておかないと表示してしまうことである。
これで万事OKかと思いきや問題はまだあった。
タスクトレイに常駐させるプログラムは、フォームを表示してまた閉じる、この繰り返しが必要なのだが、2回目にフォームを表示させたとき、フォームが元のサイズに復元されない。ちょうど子フォームのようにタイトルバーだけのサイズになって左下に表示されるのである。
この原因はよくわからないのだが、WindowStateプロパティを最小化状態から標準(Normal)状態に変更する前にVisibleをTrueにしておくことで解決した。本当は後にもってきて最小化している状態を見せないようにしたかったのだが。
以下にこのサンプル画面デザインとソースを紹介する。
なお、この問題で調べた中でDOBON.NET「フォームを表示させずにトレイアイコンを表示する」に同じ問題について論じられている。ここで紹介されている「フォームのCreateParamsプロパティをオーバーライドする」では非表示に起動できても、その後2度と表示することができないものなので採用しなかった。

'--- 起動 ---
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
'NotifyIconの初期化
With NotifyIcon1
.Text = Me.Text
.Icon = Me.Icon
.ContextMenu = ContextMenu1
.Visible = True
End With
End Sub
'--- ContextMenu(表示) ---
Private Sub MenuItem1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles MenuItem1.Click
Me.Visible = True
Me.WindowState = FormWindowState.Normal
End Sub
'--- アイコンをダブルクリックは表示 ---
Private Sub NotifyIcon1_DoubleClick( _
ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles NotifyIcon1.DoubleClick
Me.Visible = True
Me.WindowState = FormWindowState.Normal
End Sub
'--- ContextMenu(終了) ---
Private Sub MenuItem3_Click( _
ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles MenuItem3.Click
NotifyIcon1.Visible = False 'トレイからアイコンを削除
Application.Exit() 'プログラムの終了
End Sub
'--- 「画面を閉じる」ボタン ---
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Me.Visible = False
Me.WindowState = FormWindowState.Minimized
End Sub
'--- 「最小化」ボタンを押したときの処理 ---
Private Sub Form1_Resize(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Resize
Select Case Me.WindowState
Case FormWindowState.Minimized
If Me.Visible = True Then Me.Visible = False
End Select
End Sub
'--- Context(終了)以外からは終了しない ---
Private Sub Form1_Closing(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles MyBase.Closing
Select Case e.CloseReason
Case CloseReason.UserClosing
e.Cancel = True '終了をキャンセル
Me.WindowState = FormWindowState.Minimized
End Select
End Sub
2012年になってVB2010で開発した際、このTipsを使ったのだがどうしたことかフォームが小さく残ってしまうことが判明、そこで新たな方法を編み出した。
http://natchan-develop.seesaa.net/article/290752211.html