为什么设置Params.WndParent允许您在IE中将Alt-Tab添加到activex应用程序

时间:2011-03-10 12:13:19

标签: delphi activex delphi-7 internet-explorer-6

我问了这个问题“ActiveX pop-up dialogue window hides IE from tasklist”并得到了答案,但没有解释。

基本上我必须设置Params.WndParent,但我现在的问题是为什么?为什么这会解决问题(导致问题)?

2 个答案:

答案 0 :(得分:2)

任务栏中显示的official documentation个窗口会告诉您这个问题的答案:

  

只要应用程序创建了一个不属于的窗口,Shell就会在任务栏上创建一个按钮。要确保窗口按钮位于任务栏上,请创建一个具有WS_EX_APPWINDOW扩展样式的无主窗口。要防止窗口按钮放在任务栏上,请使用 WS_EX_TOOLWINDOW 扩展样式创建无主窗口。作为替代方案,您可以创建一个隐藏窗口,并使此隐藏窗口成为可见窗口的所有者。

然而,规则中指出有一点不透明。 Raymond Chen summarises the rules如下:

  

有一些基本规则   Windows进入任务栏。简而言之:

     
      
  • 如果设置了WS_EX_APPWINDOW扩展样式,那么它将显示(何时   可见)。
  •   
  • 如果窗口是顶级无主窗口,则会显示   (当可见时)。
  •   
  • 否则不显示。
  •   

在链接问题的CreateParams中设置WndParent意味着窗口不再是顶级窗口成为拥有的顶级窗口。感谢Sertac和Rob纠正我。

答案 1 :(得分:0)

在引擎盖下Delphi的VCL方法ShowModal枚举所有可见的线程窗口并禁用所有这些窗口(在显示模态窗口弹出窗口之前)。 IE6 ActiveX容器无法阻止使用自己的窗口进行此类操作。 ActiveX控件在IE6中非常不安全,它们可以按照自己的意愿行事。因此,我们只在屏幕上显示一些禁用的IE窗口和一个活动的弹出窗口。但是,如果禁用该窗口,则无法在任务列表中选择该窗口。此外,您的弹出窗口具有bsToolwindow属性(或最初在Windows API中的WS_EX_TOOLWINDOW),表示它不应在任务列表中可见( Alt - Tab 切换,资源管理器任务栏)。因此,IE中没有窗口可以通过 Alt - Tab 激活。

这仅适用于没有父级的窗口。对于Delphi的ActiveX控件,默认情况下表单没有父表单(主表单除外)。当您将父级分配给您的表单,并且不使用ShowModal方法(使用answer Show方法)时,您正在阻止这种情况。在这种情况下,IE窗口不会更改其原始属性。