如何用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
相关产品推荐
相关产品推荐

