停止ボタンと再読み込みボタンの横にあるInternetExplorer8のURLバーにカスタムウィジェットを挿入しようとしています。これは私自身の個人的な生産性向上剤にすぎません。
IEフレームのこの部分の「ウィンドウモデル」は、IE8のURLバーを構成するウィンドウ(編集ボックス、コンボコントロール、停止ボタンと再読み込みボタン)を所有する「アドレスバールート」ウィンドウです。
別のプロセスから、IEのアドレスバーのルートウィンドウを親とする新しいWS_CHILDウィンドウ(カスタムクラス名を使用)を作成し、編集ボックスの兄弟にして停止/再読み込みします。HWND_TOPのhwndInsertAfterを使用してSetWindowPosを呼び出し、URLバーの「上」(つまり「中」)に表示されることを確認します。これはうまく機能し、ウィンドウが最初にIEのURLバー内にペイントされているのがわかります。
ただし、IEウィンドウをアクティブにすると、urlbar編集コントロールがウィンドウの前に戻ります。ウィンドウがURLバーの後ろにペイントされているのがまだ表示されているため、また、タイマーでデバッグコンソールに-> GetTopWindow()を出力すると、URLバー編集コントロールのHWNDになるため、これが発生していることがわかります。
メッセージループを更新して、WM_PAINTでHWND_TOPを使用してSetWindowPosを呼び出すと、状況が改善されます。IEウィンドウをアクティブにして移動すると、コントロールがURLバーの編集コントロールの上に適切に配置されたままになります。ただし、IEのURLバーの編集コントロールのテキストを更新するIEタブを切り替えるとすぐに、コントロールは編集コントロールの後ろに戻ります。(注:これは、ウィンドウを最大化または復元したときにも発生します。)
だから私の質問は:
1)IEでタブをクリックするたびに、IEが意図的にURLバー編集コントロールをz-orderの上に戻している可能性がありますか、それともWindowsのペイントとz-orderingがどのように機能するかについての私の理解にギャップがありますか?私の理解では、子ウィンドウのz順序(エンドユーザーが操作できない)を指定すると、プログラムで変更されるまでその順序を維持する必要があります。したがって、IEはタブの選択時に編集コントロールを再描画しますが、ウィンドウを再描画したり操作したりしていなくても、ウィンドウはしっかりと上に表示されたままになります。
2)ウィンドウのz順序が明らかに変化していることを考えると、WM_WINDOWPOSCHANGING / WM_WINDOWPOSCHANGEDを受け取るべきではありませんか?もしそうなら、私は少なくともそのイベントに応答し、編集コントロールの上に自分自身を保つことができました。ただし、タブをクリックするとurlbar Editコントロールの背後にウィンドウのペイントが表示され、デバッグウィンドウの出力で、タブをクリックするとアドレスバーのルートのGetTopWindow()がEditコントロールのHWNDになることが確認されます。 、およびWM_WINDOWPOSCHANGING / WM_WINDOWPOSCHANGEDがHWND_TOPのhwndInsertAfterを使用してEditコントロールに送信されているのを確認しても、タブをクリックすると、自分のウィンドウにメッセージが表示されなくなり、z順序を一定に保つことができます。これは私には間違っているように思われ、それに対処すると、IEで実行する必要があります。
ご協力ありがとうございました!