4

我有一个从非 VCL 主机应用程序加载的混合 CBuilder/Delphi dll。我正在使用 RAD Studio XE2。加载 dll 后,我将应用程序句柄设置为主机的主窗体,这具有使我的窗体和对话框远离任务栏的效果。但是我想在任务栏上显示进度条并将其与主机应用程序堆叠在一起。我用谷歌搜索并广泛搜索,但找不到类似的东西。

Bob 博士在这里写了一个关于任务栏各种功能的很好的教程,从那里我得到了一个显示在主应用程序的任务栏按钮中的进度条,但我真的想为进度条创建第二个“堆叠”图标,很多应用程序都会这样做。Bob 博士的示例假设您是主应用程序的一部分,并使用此代码添加一个选项卡:

if not Application.MainFormOnTaskBar then
  FormHandle := Application.Handle
else FormHandle := Application.MainForm.Handle;
TaskbarList.AddTab(FormHandle);

在我的情况下,这没有任何作用。我试过了

FormHandle := FindWindow('TfmProg', NIL);
TaskbarList.addTab(FormHandle);

但这并没有改变任何事情。

我已经创建了以 Application 作为所有者和 NIL 的表单。我已经创建了 fsNormal 或 fsStayOnTop。坦率地说,我已经触及了我能得到的每一个参数,但似乎没有任何效果。

4

1 回答 1

2

您设置Application.Handle为主机应用程序主窗体的句柄是正确的。这将使主机应用程序的主窗口成为您的窗口的所有者。但是,正如您所观察到的,这也会使您的顶级窗口远离任务栏。那是因为拥有的顶级窗口不会出现在任务栏中。

要将拥有的顶级窗口放在任务栏上,您应该包括WS_EX_APPWINDOW扩展窗口样式。将此添加到表单的CreateParams过程中。

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

然后,您可以使用ITaskbarList3.SetProgressStateandITaskbarList3.SetProgressValue传递表单的句柄,以显示表单任务栏按钮的任务栏进度。


我必须承认我发现你的代码很奇怪:

FormHandle := FindWindow('TfmProg', NIL);
TaskbarList.addTab(FormHandle);

Since the code is running in your DLL, which also created the form, you shouldn't be using FindWindow to obtain the handle. You can just use Form.Handle where Form is the reference to your form instance. That said, I'd still prefer the approach outlined above, using WS_EX_APPWINDOW, since it is resilient to window handle re-creation and feels rather simpler to me.

于 2013-02-27T22:45:44.977 回答