投稿者 YuO  (社会人) 投稿日時 2013/5/7 02:25:29
VisibleChanged内で
・MessageBox APIを実行
・Formを作ってShowDialog(Me)を実行
のどちらでもShownがOnVisibleChanged終了より前に動く,ということから,APIレベル,DialogBox系APIの内部動作が関係していそうです。

VisibleChangedに入った後から,OnShownまでにWndProcメソッドで捕らえたメッセージは以下の通りです。
・WM_CANCELMODE
・WM_ENABLE (wParam = 0)
・WM_WINDOWPOSCHANGING (flags = &h0037 : SWP_DRAWFRAME Or SWP_NOACTIVATE Or SWP_NOZORDER Or SWP_NOMOVE Or SWP_NOSIZE)
・WM_ACTIVATEAPP (wParam = 1, lParam = 1)
・WM_DWMNCRENDERINGCHANGED (wParam = 1)
・unknwon (&hC1E4, RegisterWindowMessage)
直接的には最後のuMsgが&hC1E4の時にShownが呼び出されるようですが,
これ自体はRegisterWindowMessage APIで登録された値であると思われるため,
これをAPIがSendしているとは考えられず,この値をSendMessageしているコードがあると思われます。

また,それ以外のメッセージを投げてもOnShownは呼ばれませんでした。
.NETのソースコードを解析していけば,なぜShownが呼ばれるかが見つかるかもしれませんが,そこまでは解析していません。