Playing with the new powerfull taskbar under Windows Se7en.
Use the taskbar button application as a progress bar...
Have fun
Pierre
'Playing with the new powerfull taskbar under Windows Se7en
'Use the taskbar button application as a progress bar
'Have fun, Pierre
'http://msdn.microsoft.com/en-us/magazine/dd942846.aspx
'http://fsoriano.developpez.com/articles/windows7/delphi/utilisez-barre-taches-windows-7-dans-vos-applications-delphi-2010/
#COMPILE EXE '#Win 8.04#
#DIM ALL
#REGISTER NONE
#INCLUDE "Win32Api.inc"
GLOBAL hDlg AS DWORD
%Label1                 = 101
%Button1                = 201
%TimerOne               = 301
%TBPF_NOPROGRESS        = 0
%TBPF_INDETERMINATE     = 1
%TBPF_NORMAL            = 2
%TBPF_ERROR             = 4
%TBPF_PAUSED            = 8
%CLSCTX_INPROC_SERVER   = 1
$CLSID_TaskbarList      = GUID$("{56FDF344-FD6D-11D0-958A-006097C9A090}")
$IID_ITaskbarList3      = GUID$("{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}")
'______________________________________________________________________________
FUNCTION M_CALLs(BYVAL ObjectPtr AS DWORD, BYVAL MethodName AS DWORD, OPTIONAL BYVAL v1 AS DWORD, _
                 BYVAL v2 AS DWORD, BYVAL v3 AS DWORD, BYVAL v4 AS DWORD, BYVAL v5 AS DWORD) AS LONG
 'Thank you José...
 ! push v5                    'Push parameter 5
 ! push v4                    'Push parameter 4
 ! push v3                    'Push parameter 3
 ! push v2                    'Push parameter 2
 ! push v1                    'Push parameter 1
 ! mov eax, ObjectPtr         'Move pointer to COM object into eax
 ! mov ecx, MethodName        'Move method to execute into ecx
 ! push eax
 ! mov eax, [eax]             'Move pointer to eax into eax
 ! CALL DWORD PTR [eax + ecx] 'Call method offset
 ! mov FUNCTION, eax          'Move return value into function
END FUNCTION
'______________________________________________________________________________
CALLBACK FUNCTION DlgProc() AS LONG
 STATIC CLSID_TaskbarList       AS STRING * 16
 STATIC IID_ITaskbarList3       AS STRING * 16
 STATIC pTaskBar                AS DWORD POINTER
 STATIC WM_TASKBARBUTTONCREATED AS DWORD
 STATIC TaskbarButtonCreated    AS DWORD
 STATIC ProgressPos             AS DWORD
 STATIC ProgressMax             AS DWORD
 STATIC ProgressState           AS LONG
 STATIC TimerStarted            AS LONG
 STATIC Delta                   AS LONG
 LOCAL  RetVal                  AS LONG
 SELECT CASE CBMSG
   CASE %WM_INITDIALOG
     IID_ITaskbarList3 = $IID_ITaskbarList3
     CLSID_TaskbarList = $CLSID_TaskbarList
     ProgressPos       = 0
     ProgressMax       = 100
     ProgressState     = %TBPF_NORMAL
     Delta             = 1
     'Windows need time to create the taskbar button before we can play with it.
     'So wait until we receive designated WM_TASKBARBUTTONCREATED message
     WM_TASKBARBUTTONCREATED = RegisterWindowMessage("TaskbarButtonCreated")
     'If successfull return a message id in the range 0xC000 through 0xFFFF.
   CASE WM_TASKBARBUTTONCREATED 'Message sent by Windows 7 after the creation of the taskbar button
     TaskbarButtonCreated = %TRUE
     CoInitialize(BYVAL %NULL)
     IF CoCreateInstance(BYVAL VARPTR(CLSID_TaskbarList), BYVAL 0, %CLSCTX_INPROC_SERVER, _
                         BYVAL VARPTR(IID_ITaskbarList3), pTaskBar) = %S_OK THEN
       Retval = M_CALLs(pTaskBar, 12, hDlg) '%HrInit
      'Retval = M_CALLs(pTaskBar, 40, hDlg, BYVAL %TBPF_NORMAL)        'SetProgressState Green
      'Retval = M_CALLs(pTaskBar, 40, hDlg, BYVAL %TBPF_ERROR)         'SetProgressState Red
      'Retval = M_CALLs(pTaskBar, 40, hDlg, BYVAL %TBPF_PAUSED)        'SetProgressState Yellow
       Retval = M_CALLs(pTaskBar, 40, hDlg, BYVAL %TBPF_INDETERMINATE) 'Green marquee
      'Retval = M_CALLs(pTaskBar, 40, hDlg, BYVAL %TBPF_NOPROGRESS)    'No progress
      'Retval = M_CALLs(pTaskBar, 36, hDlg, BYVAL ProgressPos, 0, BYVAL ProgressMax, 0) 'SetProgressValue
     END IF
   CASE %WM_COMMAND
     SELECT CASE LOWRD(CBWPARAM)
       CASE %Button1
         IF CBCTLMSG = %BN_CLICKED THEN
           IF TaskbarButtonCreated THEN
             IF TimerStarted = %FALSE THEN
               TimerStarted = %TRUE
               SetTimer(hDlg, %TimerOne, 10, BYVAL %NULL)
               CONTROL SET TEXT hDlg, %Button1, "&Stop"
               CONTROL SET TEXT hDlg, %Label1, "TBPF_NORMAL"
             ELSE
               TimerStarted = %FALSE
               KillTimer(hDlg, %TimerOne)
               CONTROL SET TEXT hDlg, %Button1, "&Start"
               CONTROL SET TEXT hDlg, %Label1, "TBPF_INDETERMINATE"
               Retval = M_CALLs(pTaskBar, 40, hDlg, BYVAL %TBPF_INDETERMINATE) 'Green marquee
             END IF
           ELSE
             MessageBox hDlg, "Need at least Windows Se7ven !", "TaskBArProgress", %MB_ICONINFORMATION OR %MB_OK
           END IF
         END IF
     END SELECT
   CASE %WM_TIMER
     IF CBWPARAM = %TimerOne THEN
       ProgressPos = ProgressPos + Delta
       M_CALLs(pTaskBar, 36, hDlg, BYVAL ProgressPos, 0, BYVAL ProgressMax, 0) 'SetProgressValue
       IF ProgressPos = ProgressMax THEN
         Delta = - 1
       END IF
       IF ProgressPos = 0 THEN
         Delta = 1
         IF ProgressState = %TBPF_NORMAL THEN
           ProgressState = %TBPF_ERROR
           CONTROL SET TEXT hDlg, %Label1, "TBPF_ERROR"
         ELSEIF ProgressState = %TBPF_ERROR THEN
           ProgressState = %TBPF_PAUSED
           CONTROL SET TEXT hDlg, %Label1, "TBPF_PAUSED"
         ELSE
           ProgressState = %TBPF_NORMAL
           CONTROL SET TEXT hDlg, %Label1, "TBPF_NORMAL"
         END IF
         M_CALLs(pTaskBar, 40, hDlg, ProgressState) 'SetProgressState
       END IF
     END IF
   CASE %WM_DESTROY
     IF TaskbarButtonCreated THEN
       IF TimerStarted THEN
         KillTimer(hDlg, %TimerOne)
       END IF
       CoUninitialize
     END IF
  END SELECT
END FUNCTION
'______________________________________________________________________________
FUNCTION PBMAIN()
 DIALOG NEW %HWND_DESKTOP, "Taskbar Progress ", , , 200, 100, _
 %WS_CAPTION OR %WS_MINIMIZEBOX OR %WS_SYSMENU, 0 TO hDlg
 SetClassLong(hDlg, %GCL_HICON, LoadIcon(BYVAL %NULL, BYVAL %IDI_INFORMATION)) 'Icon from Windows
 CONTROL ADD BUTTON, hDlg, %Button1, "Start", 85, 35, 35, 15
 CONTROL ADD LABEL, hDlg, %Label1, "ProgressBar in Taskbar button : TBPF_INDETERMINATE", _
 5, 60, 190, 15, %SS_CENTER
 DIALOG SHOW MODAL hDlg CALL DlgProc
END FUNCTION
'______________________________________________________________________________
'
			
			
				Here is Pierre's example using PB 10 direct interface calls and my headers:
#COMPILE EXE
#DIM ALL
#INCLUDE "windows.inc"
#INCLUDE "shobjidl.inc"
%Label1                 = 101
%Button1                = 201
%TimerOne               = 301
CALLBACK FUNCTION DlgProc() AS LONG
   STATIC pTaskBar                AS ITaskbarList3
   STATIC WM_TASKBARBUTTONCREATED AS DWORD
   STATIC TaskbarButtonCreated    AS DWORD
   STATIC ProgressPos             AS QUAD
   STATIC ProgressMax             AS QUAD
   STATIC ProgressState           AS LONG
   STATIC TimerStarted            AS LONG
   STATIC Delta                   AS LONG
   LOCAL  RetVal                  AS LONG
   SELECT CASE CB.MSG
      CASE %WM_INITDIALOG
         ProgressPos       = 0
         ProgressMax       = 100
         ProgressState     = %TBPF_NORMAL
         Delta             = 1
         ' // Windows needs time to create the taskbar button before we can play with it.
         ' // So wait until we receive designated WM_TASKBARBUTTONCREATED message
         WM_TASKBARBUTTONCREATED = RegisterWindowMessage("TaskbarButtonCreated")
      CASE WM_TASKBARBUTTONCREATED 'Message sent by Windows 7 after the creation of the taskbar button
         TaskbarButtonCreated = %TRUE
         pTaskBar = NEWCOM CLSID $CLSID_TaskbarList
         IF ISOBJECT(pTaskBar) THEN
            pTaskBar.HrInit
            pTaskBar.SetProgressState(CB.HNDL, %TBPF_INDETERMINATE)   ' // Green marquee
'            pTaskBar.SetProgressState(CB.HNDL, %TBPF_NORMAL)          ' // Green
'            pTaskBar.SetProgressState(CB.HNDL, %TBPF_ERROR)           ' // Red
'            pTaskBar.SetProgressState(CB.HNDL, %TBPF_PAUSED)          ' // Yellow
'            pTaskBar.SetProgressState(CB.HNDL, %TBPF_NOPROGRESS)      ' // No progress
        END IF
      CASE %WM_COMMAND
         SELECT CASE LO(WORD, CB.WPARAM)
            CASE %Button1
               IF CB.CTLMSG = %BN_CLICKED THEN
                  IF TaskbarButtonCreated THEN
                     IF TimerStarted = %FALSE THEN
                        TimerStarted = %TRUE
                        SetTimer(CB.HNDL, %TimerOne, 10, BYVAL %NULL)
                        CONTROL SET TEXT CB.HNDL, %Button1, "&Stop"
                        CONTROL SET TEXT CB.HNDL, %Label1, "TBPF_NORMAL"
                     ELSE
                        TimerStarted = %FALSE
                        KillTimer(CB.HNDL, %TimerOne)
                        CONTROL SET TEXT CB.HNDL, %Button1, "&Start"
                        CONTROL SET TEXT CB.HNDL, %Label1, "TBPF_INDETERMINATE"
                        pTaskBar.SetProgressState(CB.HNDL, %TBPF_INDETERMINATE)
                     END IF
                  ELSE
                     MessageBox CB.HNDL, "Need at least Windows Se7ven !", "TaskBArProgress", %MB_ICONINFORMATION OR %MB_OK
                  END IF
               END IF
            END SELECT
      CASE %WM_TIMER
         IF CB.WPARAM = %TimerOne THEN
            ProgressPos = ProgressPos + Delta
            pTaskbar.SetProgressValue(CB.HNDL, ProgressPos, ProgressMax)
            IF ProgressPos = ProgressMax THEN Delta = - 1
            IF ProgressPos = 0 THEN
               Delta = 1
               IF ProgressState = %TBPF_NORMAL THEN
                  ProgressState = %TBPF_ERROR
                  CONTROL SET TEXT CB.HNDL, %Label1, "TBPF_ERROR"
               ELSEIF ProgressState = %TBPF_ERROR THEN
                  ProgressState = %TBPF_PAUSED
                  CONTROL SET TEXT CB.HNDL, %Label1, "TBPF_PAUSED"
               ELSE
                  ProgressState = %TBPF_NORMAL
                  CONTROL SET TEXT CB.HNDL, %Label1, "TBPF_NORMAL"
               END IF
               pTaskBar.SetProgressState(CB.HNDL, ProgressState)
            END IF
         END IF
      CASE %WM_DESTROY
         IF TaskbarButtonCreated THEN
            IF TimerStarted THEN KillTimer(CB.HNDL, %TimerOne)
         END IF
  END SELECT
END FUNCTION
'______________________________________________________________________________
FUNCTION PBMAIN()
   LOCAL hDlg AS DWORD
   DIALOG NEW %HWND_DESKTOP, "Taskbar Progress ", , , 200, 100, %WS_CAPTION OR %WS_MINIMIZEBOX OR _
              %WS_MAXIMIZEBOX OR %WS_SYSMENU OR %WS_THICKFRAME, 0 TO hDlg
   SetClassLong(hDlg, %GCL_HICON, LoadIcon(BYVAL %NULL, BYVAL %IDI_INFORMATION)) ' Icon from Windows
   CONTROL ADD BUTTON, hDlg, %Button1, "Start", 85, 35, 35, 15
   CONTROL ADD LABEL, hDlg, %Label1, "ProgressBar in Taskbar button : TBPF_INDETERMINATE", 5, 60, 190, 15, %SS_CENTER
   DIALOG SHOW MODAL hDlg CALL DlgProc
END FUNCTION
'______________________________________________________________________________
'