如何为非主窗体获取任务栏按钮?

18

在Delphi中如何使一个表单出现在任务栏上?例如,在Firefox中,当您在新窗口中打开一个页面时,它会在任务栏上创建另一个窗口而不创建新进程。目前,我的Delphi应用程序在单击按钮时会打开一个新表单,但任务栏仍然只有一个东西,因此您无法在主表单和单击按钮时创建的表单之间进行alt-tab切换。我该如何更改代码以使新表单显示为新任务栏按钮?我的当前代码如下:

procedure Form1ButtonClick(Sender: TObject);
begin
    Form2.Show;
end;

我一直在尝试使用CreateWindowEx,但理想情况下,我希望能找到一个比直接使用Windows API更简单的解决方案。

2个回答

31
如果我正确理解你的要求,你可以通过重写CreateParams过程来在任务栏上显示次要窗体,就像这篇Minimize child forms independent of the main form delphi.about.com文章所解释的那样:
interface

type
  TMyForm = class(TForm)
  ...
  protected
    procedure CreateParams(var Params: TCreateParams) ; override;
  ...

implementation

procedure TMyForm.CreateParams(var Params: TCreateParams) ;
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := 0;
end;

12
关于如何设置WndParent,About.com的文章是错误的。《The Old New Thing》解释了将桌面设为应用程序窗口的父窗口是错误的原因。我已经在这里修复了代码。 - Rob Kennedy
4
在CreateParams中,你应该选择其中一个,而不需要两个都做。 - David Heffernan

1

如果在表单顺序中不使用此行更好:

Params.WndParent := 0;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接