pinewell's farmer blog 農業と電子工作、ソフトウェア、バイク、車

2013年11月26日

副業でハマる。MDIでのタスクバー。

Filed under: 副業 — pinewell @ 7:00 PM

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日を費やすことになってしまった。

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress