Delphi表单保持在其自身之上

Delphi表单保持在其自身之上,delphi,winapi,Delphi,Winapi,我有一个应用程序,它的窗口位于其他窗口的前面,但也位于其他“保持在顶部”窗口的前面,方法是检查Z顺序,如果它不是最顶部,则向前移动。这可以正常工作,除了我的窗口有弹出的控件,比如组合框和提示。然后发生的事情是窗口在提示前面移动 我尝试的逻辑查看前面窗口的句柄,然后尝试查看其所有者(使用getwindow(h,GW_owner))或父对象(getparent(h))是否是我的窗口。如果失败,它将继续递归调用以查看我的窗口是否是其父窗口的父窗口等 这不起作用,然后我的应用程序试图将自己放在弹出控件前

我有一个应用程序,它的窗口位于其他窗口的前面,但也位于其他“保持在顶部”窗口的前面,方法是检查Z顺序,如果它不是最顶部,则向前移动。这可以正常工作,除了我的窗口有弹出的控件,比如组合框和提示。然后发生的事情是窗口在提示前面移动

我尝试的逻辑查看前面窗口的句柄,然后尝试查看其所有者(使用getwindow(h,GW_owner))或父对象(getparent(h))是否是我的窗口。如果失败,它将继续递归调用以查看我的窗口是否是其父窗口的父窗口等

这不起作用,然后我的应用程序试图将自己放在弹出控件前面,这并不理想。对其他方法有什么建议吗

谢谢
Terry

提示具有作为父级和所有者的应用程序句柄。因此,对h=application.handle的测试为他们解决了问题。组合框似乎是另一个故事,调用以获取父级返回65556,而所有者给出0

您无法可靠地解决此问题

你要做的是玩一个不同的游戏。没有人能赢

在这种情况下,您可以同时构建墙(组合框、提示等)和梯子(希望位于最顶端的窗口)。即使你不这样做,你也不会赢


请参阅。

正如Sertac Akyuz所建议的,跟踪windows的进程ID并将其与您自己的ID进行比较是确定窗口所有权的一种方法

这些是工人的工资sin@DavidHeffernan好的。或者详细说明一下:这只是你学会不做的事情之一。选择制作StayOnTop表格已经够糟糕的了,一次又一次地积极推广它确实会让你陷入地狱厨房。看看它们的线索,如果它们来自同一条线索,而你呆在顶部窗口,它们不应该是敌对的。@DavidHeffernan罪恶的工资的确是如此,但不幸的是,由于其他人的罪恶,它们是必要的(一个应用程序有两个错误?)。这是一种可以在情况需要时打开的行为。@Sertac Akyuz这是一个很好的观点。我不担心被自己的窗口覆盖,只担心其他应用程序会遮挡一个可以调用其他窗口的小浮动图形。按照Sertac的建议应该可以做到。虽然不太漂亮,但选项有限。