How do I show progress in status/task bar button using Delphi 7?

后端 未结 3 551
面向向阳花
面向向阳花 2020-12-24 14:50

If you copy files under Windows 7, you will see the progress of the copy in a sort of progress bar begin displayed in the status or task bar button<

3条回答
  •  盖世英雄少女心
    2020-12-24 15:22

    Also you can try my unit (Tested in Delphi 7):

    {*******************************************************************************
    
                          Windows 7 TaskBar Progress Unit File
    
                               File Version: 0.0.0.3
    
                           https://github.com/tarampampam
    
    *******************************************************************************}
    
    
    unit Win7TaskBarProgressUnit;
    
    interface
    
    uses
      Windows, ActiveX;
    
    type
      ITaskbarList = interface(IUnknown)
        ['{56FDF342-FD6D-11D0-958A-006097C9A090}']
        function HrInit: HRESULT; stdcall;
        function AddTab(hwnd: LongWord): HRESULT; stdcall;
        function DeleteTab(hwnd: LongWord): HRESULT; stdcall;
        function ActivateTab(hwnd: LongWord): HRESULT; stdcall;
        function SetActiveAlt(hwnd: LongWord): HRESULT; stdcall;
      end;
    
      ITaskbarList2 = interface(ITaskbarList)
        ['{602D4995-B13A-429B-A66E-1935E44F4317}']
        function MarkFullscreenWindow(hwnd: LongWord;
          fFullscreen: LongBool): HRESULT; stdcall;
      end;
    
      ITaskbarList3 = interface(ITaskbarList2)
        ['{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}']
        procedure SetProgressValue(hwnd: LongWord; ullCompleted: UInt64; ullTotal: UInt64); stdcall;
        procedure SetProgressState(hwnd: LongWord; tbpFlags: Integer); stdcall;
      end;
    
    type
      TTaskBarProgressStyle = (tbpsNone, tbpsIndeterminate, tbpsNormal, tbpsError, tbpsPaused);
    
      TWin7TaskProgressBar = class
        glHandle: LongWord;
        glMin: Byte;
        glMax,
        glValue: Integer;
        glStyle: TTaskBarProgressStyle;
        glVisible,
        glMarquee: Boolean;
        glTaskBarInterface: ITaskbarList3;
      private
        procedure SetProgress(const Value: Integer);
        procedure SetMax(const Value: Integer);
        procedure SetStyle(const Style: TTaskBarProgressStyle);
        procedure SetVisible(const IsVisible: Boolean);
        procedure SetMarquee(const IsMarquee: Boolean);
      published
        constructor Create(const Handle: LongWord);
        property Max: Integer read glMax write SetMax default 100;
        property Min: Byte read glMin default 0;
        property Progress: Integer read glValue write SetProgress default 0;
        property Marquee: Boolean read glMarquee write SetMarquee default False;
        property Style: TTaskBarProgressStyle read glStyle write SetStyle default tbpsNone;
        property Visible: Boolean read glVisible write SetVisible default False;
        destructor Destroy; override;
      end;
    
    implementation
    
    procedure TWin7TaskProgressBar.SetMax(const Value: Integer);
    begin
      glMax := Value;
      SetProgress(glValue);
    end;
    
    procedure TWin7TaskProgressBar.SetProgress(const Value: Integer);
    begin
      if (glTaskBarInterface <> nil) and (glHandle <> 0) then begin
        glValue := Value;
        if not glMarquee then
          glTaskBarInterface.SetProgressValue(glHandle, UInt64(glValue), UInt64(glMax));
      end;
    end;
    
    procedure TWin7TaskProgressBar.SetStyle(const Style: TTaskBarProgressStyle);
    const
      Flags: array[TTaskBarProgressStyle] of Cardinal = (0, 1, 2, 4, 8);
    begin
      if (glTaskBarInterface <> nil) and (glHandle <> 0) then
        glTaskBarInterface.SetProgressState(glHandle, Flags[Style]);
    
      glStyle := Style;
    end;
    
    procedure TWin7TaskProgressBar.SetVisible(const IsVisible: Boolean);
    begin
      if IsVisible then begin
        if (glStyle <> tbpsNormal) then
          SetStyle(tbpsNormal)
      end else
        SetStyle(tbpsNone);
    
      glVisible := IsVisible;
    end;
    
    procedure TWin7TaskProgressBar.SetMarquee(const IsMarquee: Boolean);
    begin
      if IsMarquee then
        SetStyle(tbpsIndeterminate)
      else begin
        SetStyle(tbpsNone);
        if glVisible then begin
          SetProgress(glValue);
          SetStyle(tbpsNormal);
        end;
      end;
    
      glMarquee := IsMarquee;
    end;
    
    constructor TWin7TaskProgressBar.Create(const Handle: LongWord);
    const
      CLSID_TaskbarList: TGUID = '{56FDF344-FD6D-11d0-958A-006097C9A090}';
    var
      OSVersionInfo : TOSVersionInfo;
    begin
      OSVersionInfo.dwOSVersionInfoSize := sizeof(TOSVersionInfo);
      if (Handle <> 0) and GetVersionEx(OSVersionInfo) then
        if OSVersionInfo.dwMajorVersion >= 6 then try
          glHandle := Handle;
          CoCreateInstance(CLSID_TaskbarList, nil, CLSCTX_INPROC, ITaskbarList3, glTaskBarInterface);
    
          if (glTaskBarInterface <> nil) then
            glTaskBarInterface.SetProgressState(glHandle, 0);
    
          glMin := 0;
          glMax := 100;
          glValue := 10;
          glStyle := tbpsNormal;
    
          SetStyle(glStyle);
          SetVisible(glVisible);
        except
          glTaskBarInterface := nil;
        end;
    end;
    
    
    destructor TWin7TaskProgressBar.Destroy;
    begin
      if (glTaskBarInterface <> nil) then begin
        glTaskBarInterface.SetProgressState(glHandle, 0);
        glTaskBarInterface := nil;
      end;
    end;
    
    end.
    

提交回复
热议问题