ACCESS2000案件からのリプレイス。
MDIで作らねばならないのだが、実際にやってみるとタスクバーの挙動が違う。
ACCESSではMDIなのにタスクバーに子フォームが表示される。
開発環境のWindows8.1+VisualStudio2013では子フォームはタスクバーに表示されない。
子ウィンドウが重なった時に下になった子ウィンドウを戻せないことに。
ITaskbarListを使ってようやくタスクバーに子ウィンドウを表示させたのは良いが、
子ウィンドウを下にして実際にやってみると子ウィンドウのタスクバーをクリックしても子ウィンドウが上にならない。
親ウィンドウがアクティブになるだけで、クリックした子ウィンドウがアクティブになるわけではなかったのですよ。
何か方法はないものかと調べてみたがタスクバーのイベントを捕まえることは.NETでは想定されていないようで・・・。
ダメ元で親ウィンドウのウィンドウメッセージを調べてみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Protected Overrides Sub WndProc(ByRef m As Message) 'タスクバー上をクリックした時に子フォームをアクティブにするために必要 MyBase.WndProc(m) If m.Msg = 6 Then 'Activate? 'どうやら LParamにタスクバーで押されたFormのhandleが入るようだ. 'Debug.Print("WndProc:" & m.LParam.ToString) Dim frm As Form For Each frm In Me.MdiChildren If frm.Handle = m.LParam Then frm.Activate() Exit For End If Next End If End Sub |
タスクバー上の子ウィンドウをクリックした場合に、LParamに子ウインドウのhandleが渡されているようなので、
これを捕捉して子ウィンドウをアクティブにすることが出来た。
ITaskbarListから始まり、ほぼ1日を費やすことになってしまった。