WM_SHOWWINDOWはいつ発生するのでしょうか? への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 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しているか、又、何がしたいかを書いた方が識者の方々から
よりよいアドバイスが受けられるのでは?
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
落ちる事が有ります。
ソフトではこれを受け取れるように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
質問自体がナンセンスでした。
WM_SHOWWINDOWが2回来ているという事自体思い込みでした。
スプラッシュ表示からメインフォーム表示まで色々と処理が有って、
時間がかかっているため、wndprocで例外が起きると、メインフォーム表示
まで分からないため、2回来ていると感じてましたが、そもそも、
例外が起きているのは、1回目のwndprocが正常に終了できていなかったみたいです。
私の勘違いでお騒がせしました。失礼しました。