2013-02-27 106 views
4

我有一个混合的CBuilder/Delphi dll,可以从非VCL主机应用程序中加载。我正在使用RAD Studio XE2。在加载的dll我设置的应用程序句柄到主机的主要形式,它具有保持我的形式和对话框关闭任务栏的效果。不过,我想在任务栏上显示进度条并将其与主机应用程序堆叠在一起。我已经Google搜索并广泛搜索,但找不到类似的东西。如何从非delphi应用程序在任务栏上显示delphi dll进度条

鲍勃博士在任务栏的各种功能写了一个很好的教程here和我已经得到了显示在主应用程序的任务栏按钮了一个进度条,但我真的想创建第二个“叠加”图标对于进度条来说,很多应用程序都是这样做的。鲍勃博士的例子假设你的主要应用程序的一部分,并使用此代码添加一个标签:

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。坦率地说,我已经触及了我可以获得的每个参数,但似乎没有任何工作。

+1

如果'AddTab'无法添加一个标签,它应该返回HRESULT告诉你为什么。它在这种情况下告诉你什么? – 2013-02-27 22:28:35

+0

你好@RobKennedy,返回的值是0,或S_OK我想。我怀疑这个标签是正确创建的,但是父错误,也许是隐藏的形式? – marcp 2013-02-28 03:36:40

回答

2

将“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.SetProgressStateITaskbarList3.SetProgressValue,通过表单的处理,以显示你的窗体的任务栏按钮任务栏上的进步。


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

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

由于代码在你的DLL,这也创造了形式运行,你不应该使用FindWindow以获得句柄。你可以只用Form.Handle其中Form是参考你的窗体实例。尽管如此,我仍然喜欢的方式,上文所述,使用WS_EX_APPWINDOW,因为它是弹性的窗口句柄再创造,感觉相当简单的给我。

+0

谢谢@DavidHeffernan。那就是诀窍。我曾尝试过类似的东西,但必须得到错误的语法。我可能忘了重写。一个例子是一件美妙的事情。干杯。 – marcp 2013-02-28 03:34:28

相关问题