You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Delphi代码将应用固定到Windows任务栏?

在Delphi FMX/VCL应用中实现编程固定到Windows任务栏

要在Delphi应用中实现编程式固定到Windows任务栏,我们可以直接调用Windows Shell提供的官方COM接口ITaskbarList3,这是微软推荐的稳定方式,避免修改注册表等非官方操作带来的兼容性问题。以下是针对FMX和VCL应用的实现方案:

前置准备

确保引用以下单元(根据VCL/FMX调整):

  • VCL:ShellAPI, ShlObj, ComObj, ActiveX, Windows
  • FMX:FMX.Forms, FMX.Platform.Win, ShellAPI, ShlObj, ComObj, ActiveX, Windows

核心代码实现

我们将代码用Windows编译指令封装,确保仅在Windows平台生效:

{$IFDEF MSWINDOWS}
uses
  Windows, ActiveX, ComObj, ShlObj, ShellAPI;

type
  // 声明ITaskbarList3接口(部分Delphi版本未内置,需自行声明)
  ITaskbarList3 = interface(ITaskbarList2)
    ['{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}']
    function SetProgressValue(hwnd: HWND; ullCompleted: UInt64; ullTotal: UInt64): HRESULT; stdcall;
    function SetProgressState(hwnd: HWND; tbpFlags: DWORD): HRESULT; stdcall;
    function RegisterTab(hwndTab: HWND; hwndMDI: HWND): HRESULT; stdcall;
    function UnregisterTab(hwndTab: HWND): HRESULT; stdcall;
    function SetTabOrder(hwndTab: HWND; hwndInsertBefore: HWND): HRESULT; stdcall;
    function SetTabActive(hwndTab: HWND; hwndMDI: HWND; dwReserved: DWORD): HRESULT; stdcall;
    function ThumbBarAddButtons(hwnd: HWND; cButtons: UINT; pButtons: Pointer): HRESULT; stdcall;
    function ThumbBarUpdateButtons(hwnd: HWND; cButtons: UINT; pButtons: Pointer): HRESULT; stdcall;
    function ThumbBarSetImageList(hwnd: HWND; himl: HIMAGELIST): HRESULT; stdcall;
    function SetOverlayIcon(hwnd: HWND; hIcon: HICON; pszDescription: LPCWSTR): HRESULT; stdcall;
    function SetThumbnailTooltip(hwnd: HWND; pszTip: LPCWSTR): HRESULT; stdcall;
    function SetThumbnailClip(hwnd: HWND; var prcClip: RECT): HRESULT; stdcall;
    function SetApplicationId(hwnd: HWND; pszAppId: LPCWSTR): HRESULT; stdcall;
    function IsPinned(hwnd: HWND): HRESULT; stdcall;
    function Pin(hwnd: HWND): HRESULT; stdcall;
    function Unpin(hwnd: HWND): HRESULT; stdcall;
    function IsPinAllowed(hwnd: HWND): HRESULT; stdcall;
  end;

const
  CLSID_TaskbarList: TGUID = '{56FDF344-FD6D-11d0-958A-006097C9A090}';

function PinAppToTaskbar(const AWindowHandle: HWND): Boolean;
var
  TaskbarList: ITaskbarList3;
  HR: HRESULT;
begin
  Result := False;
  // 初始化COM库
  if CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE) = S_OK then
  try
    // 创建ITaskbarList3实例
    HR := CoCreateInstance(CLSID_TaskbarList, nil, CLSCTX_INPROC_SERVER, ITaskbarList3, TaskbarList);
    if SUCCEEDED(HR) then
    begin
      // 初始化任务栏列表
      TaskbarList.HrInit;
      // 检查是否允许固定
      if SUCCEEDED(TaskbarList.IsPinAllowed(AWindowHandle)) then
      begin
        // 执行固定操作
        Result := SUCCEEDED(TaskbarList.Pin(AWindowHandle));
      end;
    end;
  finally
    CoUninitialize;
  end;
end;
{$ENDIF}

调用示例

对于VCL应用

直接传入窗体的Handle即可:

{$IFDEF MSWINDOWS}
if PinAppToTaskbar(Form1.Handle) then
  ShowMessage('应用已成功固定到任务栏')
else
  ShowMessage('固定失败,可能是系统限制或应用已固定');
{$ENDIF}

对于FMX应用

需要先获取Windows原生窗口句柄:

{$IFDEF MSWINDOWS}
uses
  FMX.Platform.Win;

var
  LWinHandle: HWND;
begin
  LWinHandle := WindowHandleToPlatform(Application.MainForm.Handle).Wnd;
  if PinAppToTaskbar(LWinHandle) then
    ShowMessage('应用已成功固定到任务栏')
  else
    ShowMessage('固定失败,可能是系统限制或应用已固定');
end;
{$ENDIF}

注意事项

  • 系统权限:普通用户权限即可完成固定操作,无需管理员权限;但如果应用是受UAC保护的系统级程序,可能需要提升权限。
  • 应用标识:如果需要更稳定的固定行为,建议设置System.AppUserModel.ID属性,避免Windows将不同实例识别为不同应用,可通过SetApplicationId方法或修改快捷方式属性实现。
  • 兼容性:该方案支持Windows 7及以上版本,符合现代Windows系统要求。
  • 错误情况:固定失败可能是应用已被固定、系统策略禁止固定,或者应用没有正确的窗口标识。

内容的提问来源于stack exchange,提问作者Martin Kakhuis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:13:14