新创建的模式窗口失去焦点,在Windows Vista中无法访问

时间:2009-04-13 12:09:17

标签: windows delphi windows-vista

有时当我在我的Delphi应用程序中打开一个模态窗口时需要一段时间才能显示,然后我注意到应用程序被阻止了,发生的情况是模态窗体是用ShowModal打开但是没有显示并且应用程序被锁定,就像模态窗口位于第一层一样。

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

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

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

感谢。

*编辑*

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

*编辑2 *

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

现在我正在尝试明确设置PopupParent,并会告诉您问题是否已解决。

6 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:7)

当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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

Alt+P+V(。dpr)默认为Application.MainFormOnTaskbar := True;,我不知道为什么,但如果我放Application.MainFormOnTaskbar := False;问题就解决了。

答案 4 :(得分:0)

您可能希望在调用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;

答案 5 :(得分:0)

我在Windows 10上遇到了同样的问题,我通过替换dpr / dproj文件来解决了这个问题:

... Application.CreateForm(TFrmMain,FrmMain);

Application.run; …

通过

... Application.CreateForm(TFrmMain,FrmMain);

尝试   FrmMain.ShowModal; 最后   FrmMain。免费; 结束;