有时当我在我的Delphi应用程序中打开一个模态窗口需要一段时间才能显示,然后我注意到应用程序被阻止了,发生了什么是模式窗体是用ShowModal打开但是没有显示和应用程序被锁定,好像模态窗口在第一层。
通常当发生这种情况时,我必须使用Alt + Tab或Windows + Tab来查找“隐藏”模式窗口,但这并不是每次都有效。
这种行为恰好发生在Vista中,但它非常烦人。
有没有办法防止这种“焦点怪异”发生?
谢谢。
*编辑*
显然设置Application.MainFormOnTaskbar:= True解决了这个问题,但现在推迟得出结论还为时尚早,因为这是随机发生的。
*编辑2 *
ModalFormOnTaskbar没有解决问题,之后我尝试设置PopupMode = pmAuto,但这只会让问题变得更糟。
现在我正在尝试显式设置PopupParent,并会告诉您问题是否已解决。
看一下PopupParent属性。您可能希望在ShowModal调用之前为模式表单明确设置它。当PopupParent为nil(默认)时,VCL的行为会有所不同,具体取决于相关PopupMode属性的值。
如果您在调用ShowModal之前将模式窗体的PopupParent设置为活动的窗体,这可能会有所帮助。
当Windows XP引入窗口重影的概念时,您开始发生的问题。由于Delphi使用的不寻常的架构(所有形式都是隐藏窗口的子项 - TApplication),许多Delphi应用程序遇到了同样的问题。
快速解决问题的一种方法是在初始化应用程序时使用disable window ghosting:
var
User32: HMODULE;
DisableProcessWindowsGhosting: TProcedure;
begin
User32 := GetModuleHandle('USER32');
if User32 <> 0 then
begin
DisableProcessWindowsGhosting := GetProcAddress(User32, 'DisableProcessWindowsGhosting');
if Assigned(DisableProcessWindowsGhosting) then
DisableProcessWindowsGhosting;
end;
end;
另一种可能(更优雅但更费力)的解决方案是normalize your Delphi application。
第三种选择是switching to Delphi 2006 (Delphi 10.0)。
除了你报告的问题,Delphi的架构引入了更多的奇怪之处,其中包括不同的任务栏菜单和无法使用flash。
我已经设法通过删除对代码中的Application.ProcessMessages的任何调用来减少很多这些事件,无论我在哪里。
Alt+P+V
(.dpr)默认有Application.MainFormOnTaskbar := True;
,我不知道为什么,但如果我把Application.MainFormOnTaskbar := False;
问题解决了。
在调用Forms.pas
之前,你可能想尝试编辑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;
我在Windows 10上遇到了同样的问题,我通过替换dpr / dproj文件解决了这个问题:
... Application.CreateForm(TFrmMain,FrmMain);
application.润; …
通过
... Application.CreateForm(TFrmMain,FrmMain);
试试FrmMain.ShowModal;最后是FrmMain.Free;结束;