投稿者 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