任务栏上的图标不会移动到第二台显示器

icon on the taskbar does not move to second monitor

我最近得到了一台新的开发计算机,它又带有 2 个显示器,但不幸的是它有 windows 10 个。
现在我还有一些仍在 Delphi 7 中开发的工具,它们可以工作,但有一个烦人的问题。

当我启动 Delphi 7 应用程序时,任务栏上的 icon 没有移动到第二台显示器。
任务栏设置为在它们打开的监视器的任务栏上显示图标。这适用于所有应用程序,但 Delphi 7 个应用程序除外。
该图标始终停留在主监视器上。

我有可用的源代码,所以我想知道是否需要在源代码中添加一些东西,或者设置一些 属性 才能让它正常工作?

使用谷歌搜索会出现很多情况,其中表单不会移动到第二台显示器,但我没有找到任何关于任务栏图标的信息。

这是因为与任务栏按钮关联的 window 句柄是 Application 对象拥有的 window 句柄,而不是主窗体的 window 句柄.

在更高版本的 Delphi 中,您可以在 .dpr 文件中写入 Application.MainFormOnTaskBar := True,这会改变行为,以便任务栏按钮与您的主窗体相关联。我相信 MainFormOnTaskBar 是在 Delphi 2007 年推出的。

迁移到 Delphi 的现代版本是解决问题的理想方法。如果您不能这样做,那么您将需要破解 VCL 代码以确保主窗体的 window 句柄是与任务栏按钮相关联的句柄。这不太可能是一件容易的事。从根本上说,您正在为继续使用早已过时的工具进行开发付出代价。


正如 Remy 指出的那样,只需进行最少的黑客攻击即可。更改 Application window 的 window 样式以删除 WS_EX_APPWINDOW 样式,并让主窗体覆盖 CreateParams 方法以设置其所有者 window 到 NULL,即 Params.WndParent := 0.

我怀疑该行为不会像使用现代 VCL 应用程序时那样流畅。例如,VCL 已被修改以减少它所做的 window 重新创建的数量,这在主 window 与任务栏按钮相关联后更为重要。