如何在非Delphi应用程序的任务栏上嵌入并显示Delphi DLL进度条实现细节的详细疑问?

2026-04-10 17:162阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计599个文字,预计阅读时间需要3分钟。

如何在非Delphi应用程序的任务栏上嵌入并显示Delphi DLL进度条实现细节的详细疑问?

我有混合的CBuilder/ Delphi dll,我从9年代VCL主机关联应用程序。我在使用RAD Studio XE2。在加载dll后,我将Application句柄设置为主窗口体,这样可以保持我的窗体和对话框不受任务栏的影响。

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

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

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

在我的情况下没有做任何事情.我试过了

如何在非Delphi应用程序的任务栏上嵌入并显示Delphi DLL进度条实现细节的详细疑问?

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

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

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

将Application.Handle设置为主机应用程序主窗体的句柄是正确的.这将使主机应用程序的主窗口成为Windows的 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.SetProgressState和ITaskbarList3.SetProgressValue,传递表单的句柄,以显示表单任务栏按钮的任务栏进度.

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

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

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

本文共计599个文字,预计阅读时间需要3分钟。

如何在非Delphi应用程序的任务栏上嵌入并显示Delphi DLL进度条实现细节的详细疑问?

我有混合的CBuilder/ Delphi dll,我从9年代VCL主机关联应用程序。我在使用RAD Studio XE2。在加载dll后,我将Application句柄设置为主窗口体,这样可以保持我的窗体和对话框不受任务栏的影响。

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

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

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

在我的情况下没有做任何事情.我试过了

如何在非Delphi应用程序的任务栏上嵌入并显示Delphi DLL进度条实现细节的详细疑问?

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

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

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

将Application.Handle设置为主机应用程序主窗体的句柄是正确的.这将使主机应用程序的主窗口成为Windows的 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.SetProgressState和ITaskbarList3.SetProgressValue,传递表单的句柄,以显示表单任务栏按钮的任务栏进度.

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

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

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