3

这是交易。主窗体设置为fsNormal. 这个主窗体是最大化的,带有一个浮动工具栏的全屏。工具栏是标准形式,样式设置为fsStayOnTop.

大多数情况下,这按预期工作。主窗体显示,工具栏浮在其顶部。

有时(这是一个寻找可重复的步骤集的麻烦)当 alt-tabbing 与其他应用程序之间(或单击任务栏上的 Delphi 应用程序图标时)可能会发生以下症状:

  1. 当 alt-tab 离开 Delphi 应用程序时,浮动的最上面fsStayOnTop的表单保持在其他应用程序的顶部。因此,如果我 alt-tab 切换到 Firefox,那么浮动菜单也会保留在 Firefox 之上。

  2. 当从另一个应用程序切换到 Delphi 应用程序时,浮动菜单不可见(因为它位于主窗体后面fsNormal)。

这是一个已知的错误还是有任何黑客迫使它工作?当应用程序的多个副本正在运行时,这似乎也最常发生(它们之间没有交互,应该在自己的窗口“沙箱”中运行)。

就好像 Delphi 混淆了哪个窗口应该在最上面并交换它们或将浮动形式更改为 stayontopofeverything 模式。

还是我误解了fsStayOnTop?我假设设置表单样式以fsStayOnTop使其保持在当前应用程序中的所有其他表单之上,而不是其他正在运行的应用程序中的所有窗口。

4

3 回答 3

0

更多信息和可能的解决方案。

将浮动形式设置为 fsnormal。

当 mainform.activate 事件触发时,调用 floatingform.bringtofront。

但我也将stayontop 用于所有其他应用程序对话框。当应用程序的多个副本正在运行时,对话框会显示相同的问题(即,如果 app1 有一个打开的对话框并且在对话框之外使用 alt-tab 键,则可能会停留在所有其他程序的顶部)。

于 2010-03-17T09:07:19.970 回答
0

我不知道这方面的错误。

让我先解释一下这个过程是如何工作的:

DelphifsStayOnTop在创建包含窗体的窗口时首先使用样式,方法是调用SetWindowPosHWND_TOPMOST参数的 win32 函数。

有关. _ _SetWindowPos

每次应用程序被停用或最小化时,Delphi 都会枚举所有最顶层的表单以规范化这些表单(规范化是 vcl 用来表示最顶层的窗口变为非最顶层的术语)并保留所有的内部列表在那一刻最上面的窗户。

每次激活或恢复应用程序时,Delphi 使用存储在最顶层窗口列表中的信息来恢复所有最顶层窗体(使用setWindowPoswithHWND_TOPMOST参数)

所以对我来说,问题似乎在于 Delphi 在最小化应用程序时枚举窗口时存储信息的方式。

我会破解最小化或停用功能并检查最上面的窗口列表(它是 on Application.FTopMostList)是否正确列出。

于 2010-03-17T09:43:57.700 回答
-1

我有一个类似的问题,这个链接对我帮助很大:Delphi: Balloon Form with fsStayOnTop not working in Win7

当我调用 Application.NormalizeTopMosts() 函数时,最顶层的表单会按照我的预期运行。

于 2012-03-09T13:38:34.917 回答