有时当我在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;