新创build的模式窗口失去了重点,并成为Windows Vista中无法访问

有时当我在Delphi应用程序中打开一个模式窗口需要一段时间才能显示出来,然后我注意到应用程序是被阻塞的,发生了什么事情,模式窗体是用ShowModal打开的,但没有显示,应用程序被locking,就好像模态窗口在第一层一样。

通常当发生这种情况时,我必须使用Alt + Tab或Windows + Tab来查找“隐藏的”模式窗口,但这种方式每次都不起作用。

这种行为只发生在Vista中,但它很烦人。

有什么办法可以防止这种“重点怪异”的发生?

谢谢。

*编辑*

显然设置Application.MainFormOnTaskbar:=真正解决了这个问题,但现在还没有结论,因为这是随机发生的。

*编辑2 *

ModalFormOnTaskbar没有解决问题,之后,我尝试设置PopupMode = pmAuto,但这只是使问题最糟糕的。

现在我试图设置PopupParent明确,并会让你知道,如果问题得到解决。

看看PopupParent属性。 您可能希望在ShowModal调用之前为您的模式形式明确设置它。 当PopupParent为零(默认)时,VCL的行为有点不同,具体取决于相关的PopupMode属性的值。

如果您在调用ShowModal之前将模式窗体的PopupParent设置为活动窗体,则可能有所帮助。

当Windows XP引入了窗口重影的概念时,您已经开始发生这个问题。 由于Delphi使用的不同寻常的架构(所有的形式都是隐藏窗口的子节点TApplication ),许多Delphi应用程序都遇到同样的问题。

快速解决问题的一种方法是在初始化应用程序时禁用窗口重影 :

var User32: HMODULE; DisableProcessWindowsGhosting: TProcedure; begin User32 := GetmoduleeHandle('USER32'); if User32 <> 0 then begin DisableProcessWindowsGhosting := GetProcAddress(User32, 'DisableProcessWindowsGhosting'); if Assigned(DisableProcessWindowsGhosting) then DisableProcessWindowsGhosting; end; end; 

另一个可能(更加优雅但费力)的解决方案是规范你的Delphi应用程序 。

第三个选项是切换到Delphi 2006(Delphi 10.0) 。

除了你所报道的问题之外,Delphi的架构引入了更多的怪异特性,其中不同的任务栏菜单和无法闪烁 。

我已经设法减少了很多这些发生,通过删除我在我的代码中的任何对Application.ProcessMessages的调用,无论我在哪里。

Alt+P+V (.dpr)具有Application.MainFormOnTaskbar := True; 对于默认,我不知道为什么,但如果我把Application.MainFormOnTaskbar := False; 问题已经解决了。

您可能需要尝试编辑Forms.pas以便在调用Application.ModalStarted()之前将以下代码添加到TCustomForm.ShowModal() Application.ModalStarted()

 if Assigned(Application) then begin while PeekMessage(msg, Application.Handle, CM_ACTIVATE, CM_DEACTIVATE, PM_REMOVE) do begin TranslateMessage(msg); DispatchMessage(msg); end; end;