如果您在
Windows 7下复制文件,您将看到一个进度条中复制的进度显示在应用程序的状态或任务栏按钮中.
可以使用Delphi 7实现吗?
我有一些漫长的操作,这将非常适合展示它的进步.
使用Total Commander的副本样品
.
解决方法
使用
ITaskbarList3接口,特别是
SetProgressState和
SetProgressValue方法.使用指定CLSID_TaskbarList和IID_ITaskbarList3的CoCreateInstance()来访问接口.
例如:
type
ITaskbarList = interface(IUnkNown)
['{56FDF342-FD6D-11D0-958A-006097C9A090}']
function HrInit: HRESULT; stdcall;
function AddTab(hwnd: HWND): HRESULT; stdcall;
function DeleteTab(hwnd: HWND): HRESULT; stdcall;
function ActivateTab(hwnd: HWND): HRESULT; stdcall;
function SetActiveAlt(hwnd: HWND): HRESULT; stdcall;
end;
ITaskbarList2 = interface(ITaskbarList)
['{602D4995-B13A-429B-A66E-1935E44F4317}']
function MarkFullscreenWindow(hwnd: HWND;
fFullscreen: BOOL): HRESULT; stdcall;
end;
THUMBBUTTON = record
dwMask: DWORD;
iId: UINT;
iBitmap: UINT;
hIcon: HICON;
szTip: packed array[0..259] of WCHAR;
dwFlags: DWORD;
end;
TThumbButton = THUMBBUTTON;
PThumbButton = ^TThumbButton;
ITaskbarList3 = interface(ITaskbarList2)
['{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}']
function SetProgressValue(hwnd: HWND; ullCompleted: ULONGLONG;
ullTotal: ULONGLONG): HRESULT; stdcall;
function SetProgressstate(hwnd: HWND;
tbpFlags: Integer): 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;
tbatFlags: Integer): HRESULT; stdcall;
function ThumbBaraddButtons(hwnd: HWND; cButtons: UINT;
pButton: PThumbButton): HRESULT; stdcall;
function ThumbBarUpdateButtons(hwnd: HWND; cButtons: UINT;
pButton: PThumbButton): 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: TRect): HRESULT; stdcall;
end;
const
CLSID_TaskbarList: TGUID = '{56FDF344-FD6D-11d0-958A-006097C9A090}';
TBPF_nopROGRESS = 0;
TBPF_INDETERMINATE = $1;
TBPF_norMAL = $2;
TBPF_ERROR = $4;
TBPF_PAUSED = $8;
var
TBL: ITaskbarList3;
I: Integer;
begin
CoCreateInstance(CLSID_TaskbarList,nil,CLSCTX_INPROC,ITaskbarList3,TBL);
if (TBL <> nil) then
TBL.SetProgressstate(Application.Handle,TBPF_INDETERMINATE);
try
for I := 0 to 100 do
begin
if (TBL <> nil) then
TBL.SetProgressValue(Application.Handle,I,100);
Sleep(1000);
end;
finally
if (TBL <> nil) then
TBL.SetProgressstate(Application.Handle,TBPF_nopROGRESS);
end;
end;