问题描述
我已从以下位置下载 CoolTrayIcon v.4.4.0:
https://torry.net/files/vcl/system/trayicons/CoolTrayIcon.zip
在 Delphi 10.4.2 中安装组件后,在 demo 文件夹中,我打开了项目“CoolTrayTest”。在这个项目中,我在按钮点击处理程序中执行以下代码:
if IsWindowVisible(Application.Handle) then
ShowWindow(Application.Handle,SW_HIDE);
这会隐藏任务栏图标。
但是当我在自己的 VCL 应用程序中尝试此代码时,任务栏图标并未隐藏。
我该怎么做才能让我自己的 VCL 应用程序也使用此代码隐藏任务栏图标? (我不想在程序开始时隐藏任务栏图标,而是故意通过单击按钮来隐藏)。
EDIT:根据 Remy 的建议,我使用以下代码:
procedure TForm1.btnTestClick(Sender: TObject);
var
T: System.Win.Taskbar.TWinTaskbar;
begin
T := System.Win.Taskbar.TWinTaskbar.Create;
try
if not FTaskBarButtonIsHidden then
begin
IsOK := T.DeleteTab(Self.Handle);
CodeSite.Send('TForm1.btnTestClick: DeleteTab',IsOK);
FTaskBarButtonIsHidden := IsOK;
end
else
begin
IsOK := T.AddTab(Self.Handle);
CodeSite.Send('TForm1.btnTestClick: AddTab',IsOK);
FTaskBarButtonIsHidden := not IsOK;
end;
finally
T.Free;
end;
end;
似乎可以。这有什么副作用吗?
解决方法
当 Application.ShowMainFormOnTaskbar
属性为 False
时(很可能在 CoolTrayIcon 演示中就是这种情况),则任务栏按钮归隐藏的 Application
窗口所有。
当 ShowMainFormOnTaskbar
改为 True
时,就像现代 Delphi 项目中的默认情况一样,任务栏按钮由 Application.MainForm
窗口而不是 Application
拥有窗口。
要隐藏/显示任务栏按钮,您需要隐藏/显示其所有者窗口。
或者,您可以使用 Win32 DeleteTab()
Shell 接口的 AddTab()
和 ITaskbarList
方法。
有关详细信息,请参阅有关 The Taskbar 的文档。特别是“管理任务栏按钮”和“修改任务栏的内容”部分。