Delphi 为什么设置Params.WndParent不允许您在IE中将选项卡替换为activex应用程序

Delphi 为什么设置Params.WndParent不允许您在IE中将选项卡替换为activex应用程序,delphi,activex,delphi-7,internet-explorer-6,Delphi,Activex,Delphi 7,Internet Explorer 6,我问了这个问题“”并得到了答案,但没有得到解释 基本上,我必须设置参数.WndParent,但我现在的问题是为什么?为什么这样做可以解决问题(因为这样做)?任务栏中出现的窗口告诉您此问题的答案: 每当应用程序创建不属于自己的窗口时,Shell就会在任务栏上创建一个按钮。要确保“窗口”按钮位于任务栏上,请使用扩展样式创建一个无主窗口。要防止窗口按钮被放置在任务栏上,请使用扩展样式创建无主窗口。或者,您可以创建一个隐藏窗口,并使此隐藏窗口成为可见窗口的所有者 然而,规定有点不透明。详情如下: 这里有

我问了这个问题“”并得到了答案,但没有得到解释

基本上,我必须设置
参数.WndParent
,但我现在的问题是为什么?为什么这样做可以解决问题(因为这样做)?

任务栏中出现的窗口告诉您此问题的答案:

每当应用程序创建不属于自己的窗口时,Shell就会在任务栏上创建一个按钮。要确保“窗口”按钮位于任务栏上,请使用扩展样式创建一个无主窗口。要防止窗口按钮被放置在任务栏上,请使用扩展样式创建无主窗口。或者,您可以创建一个隐藏窗口,并使此隐藏窗口成为可见窗口的所有者

然而,规定有点不透明。详情如下:

这里有一些基本的规则 windows进入任务栏。简言之:

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

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

在后台,Delphi的VCL方法
showmodel
枚举所有可见的线程窗口并禁用它们(在显示模式窗口弹出窗口之前)。IE6 ActiveX容器不会阻止使用自己的窗口进行此类操作。ActiveX控件在IE6中非常不安全,它们可以随心所欲。所以我们只有一些禁用的IE窗口和屏幕上的一个活动弹出窗口。但如果窗口被禁用,则无法在任务列表中选择它。此外,您的弹出窗口具有
bsToolwindow
属性(或最初在Windows API中的WS_EX_TOOLWINDOW),该属性表示它不应在任务列表中可见(Alt选项卡切换,资源管理器任务栏)。因此,我们根本没有可以通过Alt Tab激活的IE窗口


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

您是指Tab还是Alt+Tab?所指问题中的特定窗口会变成“拥有的顶级”窗口。@Sertac是这样吗?如果一个窗口有一个父窗口,那么父窗口也是所有者吗?父窗口永远不是所有者,因为“.”并且因为它们是互斥的,所以在
CreateWindowEx
中对这两个窗口使用相同的参数,传递给该参数的值是
CreateWindowEx
保存在
Params.WndParent
@Asher这个回答了你的问题吗?@David我已经阅读了链接,但是如果我的理解是正确的,那么这些文章处理的是不在任务栏上的对话。在问题中,IE仍在任务栏上,但在显示对话框时不在选项卡任务列表中。你是说设置过滤器通过IE吗?