新创建的模式窗口在Windows Vista中失去焦点并变得无法使用

Fab*_*mes 10 windows delphi windows-vista

有时当我在我的Delphi应用程序中打开一个模态窗口需要一段时间才能显示,然后我注意到应用程序被阻止了,发生了什么是模式窗体是用ShowModal打开但是没有显示和应用程序被锁定,好像模态窗口在第一层.

通常当发生这种情况时,我必须使用Alt + Tab或Windows + Tab来查找"隐藏"模式窗口,但这并不是每次都有效.

这种行为恰好发生在Vista中,但它非常烦人.

有没有办法防止这种"焦点怪异"发生?

谢谢.

*编辑*

显然设置Application.MainFormOnTaskbar:= True解决了这个问题,但现在推迟得出结论还为时尚早,因为这是随机发生的.

*编辑2*

ModalFormOnTaskbar没有解决问题,之后我尝试设置PopupMode = pmAuto,但这只会让问题变得更糟.

现在我正在尝试显式设置PopupParent,并会告诉您问题是否已解决.

Jim*_*Jim 8

看一下PopupParent属性.您可能希望在ShowModal调用之前为模式表单明确设置它.当PopupParent为nil(默认值)时,VCL的行为会有所不同,具体取决于相关PopupMode属性的值.

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


Rôm*_*con 7

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

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

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;
Run Code Online (Sandbox Code Playgroud)

另一种可能(更优雅但更费力)的解决方案是规范化您的Delphi应用程序.

第三种选择是切换到Delphi 2006(Delphi 10.0).

除了你报告的问题,Delphi的架构引入了更多的奇怪之处,其中包括不同的任务栏菜单和无法闪存.