• Welcome to Powerbasic Museum 2020-B.
 

News:

Forum in repository mode. No new members allowed.

Main Menu

Windows Se7en powerfull taskbar

Started by Pierre Bellisle, September 17, 2010, 04:03:09 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Pierre Bellisle

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
'______________________________________________________________________________
'

José Roca

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
'______________________________________________________________________________
'