【问题标题】:How to display delphi dll progressbar on taskbar from non-delphi app如何在非delphi应用程序的任务栏上显示delphi dll进度条
【发布时间】:2013-02-13 22:26:25
【问题描述】:

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

博士。 Bob 写了一篇很好的教程here 关于任务栏的各种功能,从中我得到了一个进度条显示在主应用程序的任务栏按钮中,但我真的想为进度条创建第二个“堆叠”图标,很多应用程序都会这样做。 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。坦率地说,我已经触及了我能得到的所有参数,但似乎没有任何效果。

【问题讨论】:

  • 如果AddTab 未能添加选项卡,它应该返回一个 HResult 告诉你原因。在这种情况下它告诉你什么?
  • 你好@RobKennedy,返回的值是 0,或者我认为是 s_ok。我怀疑标签创建正确但父级错误,可能是隐藏表单?

标签: delphi dll windows-7 delphi-xe2


【解决方案1】:

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

要将拥有的顶级窗口放在任务栏上,您应该包含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.SetProgressStateITaskbarList3.SetProgressValue,传递您的表单句柄,以显示表单任务栏按钮的任务栏进度。


我必须承认我觉得你的代码很奇怪:

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

由于代码在您的 DLL 中运行,它也创建了表单,因此您不应该使用 FindWindow 来获取句柄。您可以只使用Form.Handle,其中Form 是对您的表单实例的引用。也就是说,我仍然更喜欢上面概述的方法,使用WS_EX_APPWINDOW,因为它对窗口句柄的重新创建具有弹性并且对我来说感觉更简单。

【讨论】:

  • 谢谢@DavidHeffernan。那成功了。我以前尝试过类似的东西,但一定是语法错误。我可能忘记了覆盖。一个例子是一件美妙的事情。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 2010-12-14
  • 2012-01-27
  • 2012-02-07
  • 2013-08-12
  • 1970-01-01
相关资源
最近更新 更多