在Windows上,当其子顺序相对于其同级之一改变时,我的子窗口是否应该获得WM_WINDOWPOSCHANGED?

问题描述

| 我试图将自定义窗口小部件插入Internet Explorer 8网址栏中的“停止”和“重新加载”按钮旁边。这只是我个人的生产力提高者。 IE框架这一部分的“窗口模型”是“地址栏根目录”窗口,该窗口拥有包含IE8网址栏的窗口:编辑框,组合控件以及停止和重新加载按钮。 在另一个过程中,我创建了一个新的WS_CHILD窗口(具有自定义类名),该窗口由IE \的地址栏根窗口作为父窗口,从而使其成为编辑框和停止/重新加载的同级窗口。我用HWND_TOP的hwndInsertAfter调用SetWindowPos,以确保它显示在网址栏的“上方”(即“ in”)。效果很好,我看到我的窗口最初是在IE网址栏中绘制的。 但是,当我激活IE窗口时,网址栏编辑控件会跳回到窗口的前面。我知道这种情况的发生是因为我仍然看到我的窗口被绘制在网址栏的后面,并且因为当我在计时器上将-> GetTopWindow()打印到调试控制台时,它成为网址栏编辑控件的HWND。 如果我更新消息循环以在WM_PAINT上使用HWND_TOP调用SetWindowPos,情况会更好-现在,当我激活IE窗口并四处移动时,我的控件将正确地放置在网址栏中的编辑控件上方。但是,一旦我在IE选项卡之间切换(更新IE \的网址栏“编辑”控件的文本),我的控件就会移回“编辑”控件的后面。 (注意:当我最大化或还原窗口时,也会发生这种情况。) 所以我的问题是: 1)每次您单击IE中的选项卡时,IE可能有意将urlbar编辑控件放回z顺序的顶部,还是我对Windows绘画和z顺序的工作方式有了解?我的理解是,一旦您指定了子窗口的z顺序(最终用户无法操作),该顺序应保持不变,直到以编程方式更改为止。因此,即使IE在选择选项卡时正在重新绘制其Edit控件,而我没有在窗口上重新绘制或以其他方式作用,我的窗口仍应牢牢固定在顶部。 2)鉴于我的窗口的z顺序显然在变化,它不应该收到WM_WINDOWPOSCHANGING / WM_WINDOWPOSCHANGED吗?如果是这样,我至少可以响应该事件并使自己保持在Edit控件的顶部。但是,即使当我单击选项卡时我可以看到我的窗口在urlbar Edit控件后面绘画,并且即使我的调试窗口输出确认了当我单击时地址栏根目录的GetTopWindow()成为Edit控件的HWND在选项卡上,即使我看到WM_WINDOWPOSCHANGING / WM_WINDOWPOSCHANGED当单击选项卡时,其HWND_TOP的hwndInsertAfter发送到Edit控件时,我自己的窗口也没有收到任何使我保持Z顺序恒定的消息。这对我来说似乎是错误的,解决该问题将迫使我在IE \的进程中运行,并钩住所有发送到其Edit控件的消息,只是为了使事件响应:( 谢谢您的帮助!     

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)