如何在运行时从任务栏中隐藏我的任务栏图标?

问题描述

我已从以下位置下载 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 的文档。特别是“管理任务栏按钮”和“修改任务栏的内容”部分。