Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从非delphi应用程序在任务栏上显示delphi dll progressbar_Delphi_Dll_Windows 7_Delphi Xe2 - Fatal编程技术网

如何从非delphi应用程序在任务栏上显示delphi dll progressbar

如何从非delphi应用程序在任务栏上显示delphi dll progressbar,delphi,dll,windows-7,delphi-xe2,Delphi,Dll,Windows 7,Delphi Xe2,我有一个混合的CBuilder/Delphi dll,从非VCL主机应用程序加载。我正在使用RAD Studio XE2。加载dll后,我将应用程序句柄设置为主机的主窗体,这样可以使窗体和对话框远离任务栏。不过,我希望在任务栏上显示进度条,并将其与主机应用程序堆叠。我在谷歌上搜索了很多,但没有找到类似的东西 Bob博士写了一篇关于任务栏各种功能的不错的教程,从中我得到了一个进度条,显示在主应用程序的任务栏按钮上,但是我真的想为进度条创建第二个“堆叠”图标,很多应用程序都是这样做的。Bob博士的示

我有一个混合的CBuilder/Delphi dll,从非VCL主机应用程序加载。我正在使用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);
但这并没有改变任何事情


我已经创建了一个表单,应用程序是所有者,没有。我已经创建了fsNormal或fsStayOnTop。坦白地说,我已经触及了我能得到的每一个参数,但似乎什么都不起作用。

您正确地将
应用程序设置为主机应用程序的主窗体句柄。这将使主机应用程序的主窗口成为您的窗口的主窗口。然而,正如您所观察到的,这也使您的顶级窗口远离任务栏。这是因为任务栏中不显示拥有的顶级窗口

要在任务栏上放置自己的顶级窗口,您应该包括扩展窗口样式。将其添加到表单的
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
,因为它具有窗口处理重新创建的弹性,并且对我来说更简单。

如果
AddTab
无法添加选项卡,它应该返回一个HResult,告诉您原因。在这种情况下它会告诉你什么?Hello@RobKennedy,返回的值是0,或者我想是s_ok。我怀疑选项卡创建正确,但父项设置错误,可能是因为隐藏的表单?谢谢@DavidHeffernan。这就成功了。我以前也尝试过类似的方法,但一定是语法错误。我可能忘了超控。举个例子是件好事。干杯