WM_SHOWWINDOWはいつ発生するのでしょうか? への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 mabzou  (社会人) 投稿日時 2010/3/16 04:03:41
neptuneさん、ありがとうございます。

質問自体がナンセンスでした。
WM_SHOWWINDOWが2回来ているという事自体思い込みでした。
スプラッシュ表示からメインフォーム表示まで色々と処理が有って、
時間がかかっているため、wndprocで例外が起きると、メインフォーム表示
まで分からないため、2回来ていると感じてましたが、そもそも、
例外が起きているのは、1回目のwndprocが正常に終了できていなかったみたいです。
私の勘違いでお騒がせしました。失礼しました。
投稿者 neptune  (社会人) 投稿日時 2010/3/14 07:00:43
私も良くはわかりませんが、
WM_SHOWWINDOWってのは表示の時、非表示になる時の両方ともの発生するようですよ。
最小化、元に戻るときも。

//////////////MSDN//////////////
The WM_SHOWWINDOW message is sent to a window when the window is about to be hidden or shown.

A window receives this message through its WindowProc function. 
////////////////////////////////
でも、スプラッシュウィンドウをHookしているとすると、メイン?のフォームのmessageが
スプラッシュウィンドウのWndProcには来る事はないはずなんですが。。。
その辺り何故かは良くわかりません。

>Windowsもしくは、vbのバグなのでしょうか?
ちょっとそれを疑うにはまだ早いんじゃないでしょうか?

どこでどのように、Hookしているか、又、何がしたいかを書いた方が識者の方々から
よりよいアドバイスが受けられるのでは?
投稿者 mabzou  (社会人) 投稿日時 2010/3/13 23:13:40
極々稀にWM_SHOWWINDOWメッセージが2回来てwndproc内で
落ちる事が有ります。
ソフトではこれを受け取れるようにwndprocを
記述すべきなのでしょうか?
Windowsもしくは、vbのバグなのでしょうか?

作りとしては、スプラッシュを3分程表示してから、フォーム表示をするのですが、
●スプラッシュ表示のタイミングは必ず。
●フォーム表示のタイミングで極々稀。(この時にWM_SHOWWINDOWが来ると落ちる)
上記タイミングでWM_SHOWWINDOWが送られてくるようです。

WM_SHOWWINDOWはどのようなタイミングで
来るのが正しいでしょうか?
スプラッシュ、フォームと表示の度に来る物でしょうか?

もし、稀に2回来るのならwndproc内で処理するのが正しいのでしょうか?
自分なりに対策してみたwndprocのコードを下記に示します。
2回目の所でMyBase.WndProc(m)すると落ちてしまうので、
2回以上メッセージが来たらMyBase.WndProc(m)しないようにしました。
このような対策は正当な方法なのでしょうか?
どうも、腑に落ちないというか気持ち悪いです。







    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        Const WM_SHOWWINDOW As Integer = &H18       '24

        Try
            Select Case m.Msg
                Case WM_SHOWWINDOW
                    RLogDebug("WM_SHOWWINDOW  " & CStr(m.HWnd) & vbTab & CStr(m.Msg) _
                     & vbTab & CStr(m.WParam) & vbTab & CStr(m.LParam) & vbTab & CStr(m.Result))
                    If firsttime Then   '1回目 スプラッシュ表示時に来る。
                        MyBase.WndProc(m)
                        firsttime = False
                    Else                '2回目 極々稀にフォーム表示時に来る。
                        RLogDebug("WM_SHOWWINDOWが2回来た。") 'ここでMyBase.WndProc(m)するとcatchされてしまう。
                    End If
                Case Else
                    MyBase.WndProc(m)
            End Select
        Catch ex As Exception
            RLogDebug("WndProc(Exception)  " & CStr(m.HWnd) & vbTab & CStr(m.Msg) _
            & vbTab & CStr(m.WParam) & vbTab & CStr(m.LParam) & vbTab & CStr(m.Result))
        End Try

    End Sub