You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
759 lines
18 KiB
C++
759 lines
18 KiB
C++
2 years ago
|
// XTPTaskbarManager.cpp : implementation of the CXTPTaskbarManager class.
|
||
|
//
|
||
|
// This file is a part of the XTREME CONTROLS MFC class library.
|
||
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
||
|
//
|
||
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
||
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
||
|
// CONSENT OF CODEJOCK SOFTWARE.
|
||
|
//
|
||
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
||
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
||
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
||
|
// SINGLE COMPUTER.
|
||
|
//
|
||
|
// CONTACT INFORMATION:
|
||
|
// support@codejock.com
|
||
|
// http://www.codejock.com
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
|
||
|
#include "Common/XTPResourceManager.h"
|
||
|
#include "Common/XTPImageManager.h"
|
||
|
|
||
|
#include "XTPTaskbarManager.h"
|
||
|
|
||
|
|
||
|
|
||
|
#ifndef __ITaskbarList_INTERFACE_DEFINED__
|
||
|
#define __ITaskbarList_INTERFACE_DEFINED__
|
||
|
|
||
|
|
||
|
EXTERN_C const IID IID_ITaskbarList;
|
||
|
|
||
|
MIDL_INTERFACE("56FDF342-FD6D-11d0-958A-006097C9A090")
|
||
|
ITaskbarList : public IUnknown
|
||
|
{
|
||
|
public:
|
||
|
virtual HRESULT STDMETHODCALLTYPE HrInit( void) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE AddTab(
|
||
|
/* [in] */ HWND hwnd) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE DeleteTab(
|
||
|
/* [in] */ HWND hwnd) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE ActivateTab(
|
||
|
/* [in] */ HWND hwnd) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE SetActiveAlt(
|
||
|
/* [in] */ HWND hwnd) = 0;
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif /* __ITaskbarList_INTERFACE_DEFINED__ */
|
||
|
|
||
|
|
||
|
#ifndef __ITaskbarList2_INTERFACE_DEFINED__
|
||
|
#define __ITaskbarList2_INTERFACE_DEFINED__
|
||
|
|
||
|
/* interface ITaskbarList2 */
|
||
|
/* [object][uuid] */
|
||
|
|
||
|
|
||
|
EXTERN_C const IID IID_ITaskbarList2;
|
||
|
|
||
|
|
||
|
MIDL_INTERFACE("602D4995-B13A-429b-A66E-1935E44F4317")
|
||
|
ITaskbarList2 : public ITaskbarList
|
||
|
{
|
||
|
public:
|
||
|
virtual HRESULT STDMETHODCALLTYPE MarkFullscreenWindow(
|
||
|
/* [in] */ HWND hwnd,
|
||
|
/* [in] */ BOOL fFullscreen) = 0;
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif /* __ITaskbarList2_INTERFACE_DEFINED__ */
|
||
|
|
||
|
|
||
|
|
||
|
#ifndef __ITaskbarList3_INTERFACE_DEFINED__
|
||
|
#define __ITaskbarList3_INTERFACE_DEFINED__
|
||
|
|
||
|
|
||
|
typedef /* [v1_enum] */
|
||
|
enum THUMBBUTTONFLAGS
|
||
|
{ THBF_ENABLED = 0,
|
||
|
THBF_DISABLED = 0x1,
|
||
|
THBF_DISMISSONCLICK = 0x2,
|
||
|
THBF_NOBACKGROUND = 0x4,
|
||
|
THBF_HIDDEN = 0x8,
|
||
|
THBF_NONINTERACTIVE = 0x10
|
||
|
} THUMBBUTTONFLAGS;
|
||
|
|
||
|
//DEFINE_ENUM_FLAG_OPERATORS(THUMBBUTTONFLAGS)
|
||
|
typedef /* [v1_enum] */
|
||
|
enum THUMBBUTTONMASK
|
||
|
{ THB_BITMAP = 0x1,
|
||
|
THB_ICON = 0x2,
|
||
|
THB_TOOLTIP = 0x4,
|
||
|
THB_FLAGS = 0x8
|
||
|
} THUMBBUTTONMASK;
|
||
|
|
||
|
//DEFINE_ENUM_FLAG_OPERATORS(THUMBBUTTONMASK)
|
||
|
#include <pshpack8.h>
|
||
|
typedef struct THUMBBUTTON
|
||
|
{
|
||
|
THUMBBUTTONMASK dwMask;
|
||
|
UINT iId;
|
||
|
UINT iBitmap;
|
||
|
HICON hIcon;
|
||
|
WCHAR szTip[ 260 ];
|
||
|
THUMBBUTTONFLAGS dwFlags;
|
||
|
} THUMBBUTTON;
|
||
|
|
||
|
typedef struct THUMBBUTTON *LPTHUMBBUTTON;
|
||
|
|
||
|
#include <poppack.h>
|
||
|
#define THBN_CLICKED 0x1800
|
||
|
|
||
|
|
||
|
|
||
|
/* interface ITaskbarList3 */
|
||
|
/* [object][uuid] */
|
||
|
|
||
|
typedef /* [v1_enum] */
|
||
|
enum TBPFLAG
|
||
|
{ TBPF_NOPROGRESS = 0,
|
||
|
TBPF_INDETERMINATE = 0x1,
|
||
|
TBPF_NORMAL = 0x2,
|
||
|
TBPF_ERROR = 0x4,
|
||
|
TBPF_PAUSED = 0x8
|
||
|
} TBPFLAG;
|
||
|
|
||
|
|
||
|
EXTERN_C const IID IID_IXTPTaskbarList3;
|
||
|
|
||
|
|
||
|
MIDL_INTERFACE("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")
|
||
|
ITaskbarList3 : public ITaskbarList2
|
||
|
{
|
||
|
public:
|
||
|
virtual HRESULT STDMETHODCALLTYPE SetProgressValue(
|
||
|
/* [in] */ HWND hwnd,
|
||
|
/* [in] */ ULONGLONG ullCompleted,
|
||
|
/* [in] */ ULONGLONG ullTotal) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE SetProgressState(
|
||
|
/* [in] */ HWND hwnd,
|
||
|
/* [in] */ TBPFLAG tbpFlags) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE RegisterTab(
|
||
|
/* [in] */ HWND hwndTab,
|
||
|
/* [in] */ HWND hwndMDI) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE UnregisterTab(
|
||
|
/* [in] */ HWND hwndTab) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE SetTabOrder(
|
||
|
/* [in] */ HWND hwndTab,
|
||
|
/* [in] */ HWND hwndInsertBefore) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE SetTabActive(
|
||
|
/* [in] */ HWND hwndTab,
|
||
|
/* [in] */ HWND hwndMDI,
|
||
|
/* [in] */ DWORD dwReserved) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE ThumbBarAddButtons(
|
||
|
/* [in] */ HWND hwnd,
|
||
|
/* [in] */ UINT cButtons,
|
||
|
/* [size_is][in] */ LPTHUMBBUTTON pButton) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE ThumbBarUpdateButtons(
|
||
|
/* [in] */ HWND hwnd,
|
||
|
/* [in] */ UINT cButtons,
|
||
|
/* [size_is][in] */ LPTHUMBBUTTON pButton) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE ThumbBarSetImageList(
|
||
|
/* [in] */ HWND hwnd,
|
||
|
/* [in] */ HIMAGELIST himl) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE SetOverlayIcon(
|
||
|
/* [in] */ HWND hwnd,
|
||
|
/* [in] */ HICON hIcon,
|
||
|
/* [string][unique][in] */ LPCWSTR pszDescription) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE SetThumbnailTooltip(
|
||
|
/* [in] */ HWND hwnd,
|
||
|
/* [string][unique][in] */ LPCWSTR pszTip) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE SetThumbnailClip(
|
||
|
/* [in] */ HWND hwnd,
|
||
|
/* [in] */ RECT *prcClip) = 0;
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif /* __ITaskbarList3_INTERFACE_DEFINED__ */
|
||
|
|
||
|
|
||
|
#ifndef __IShellItem_INTERFACE_DEFINED__
|
||
|
#define __IShellItem_INTERFACE_DEFINED__
|
||
|
|
||
|
/* interface IShellItem */
|
||
|
/* [unique][object][uuid] */
|
||
|
|
||
|
typedef /* [v1_enum] */
|
||
|
enum _SIGDN
|
||
|
{ SIGDN_NORMALDISPLAY = 0,
|
||
|
SIGDN_PARENTRELATIVEPARSING = ( int )0x80018001,
|
||
|
SIGDN_DESKTOPABSOLUTEPARSING = ( int )0x80028000,
|
||
|
SIGDN_PARENTRELATIVEEDITING = ( int )0x80031001,
|
||
|
SIGDN_DESKTOPABSOLUTEEDITING = ( int )0x8004c000,
|
||
|
SIGDN_FILESYSPATH = ( int )0x80058000,
|
||
|
SIGDN_URL = ( int )0x80068000,
|
||
|
SIGDN_PARENTRELATIVEFORADDRESSBAR = ( int )0x8007c001,
|
||
|
SIGDN_PARENTRELATIVE = ( int )0x80080001
|
||
|
} SIGDN;
|
||
|
|
||
|
/* [v1_enum] */
|
||
|
enum _SICHINTF
|
||
|
{ SICHINT_DISPLAY = 0,
|
||
|
SICHINT_ALLFIELDS = ( int )0x80000000,
|
||
|
SICHINT_CANONICAL = 0x10000000,
|
||
|
SICHINT_TEST_FILESYSPATH_IF_NOT_EQUAL = 0x20000000
|
||
|
} ;
|
||
|
typedef DWORD SICHINTF;
|
||
|
|
||
|
typedef ULONG SFGAOF;
|
||
|
|
||
|
EXTERN_C const IID IID_IXTPShellItem;
|
||
|
|
||
|
|
||
|
MIDL_INTERFACE("43826d1e-e718-42ee-bc55-a1e261c37bfe")
|
||
|
IShellItem : public IUnknown
|
||
|
{
|
||
|
public:
|
||
|
virtual HRESULT STDMETHODCALLTYPE BindToHandler(
|
||
|
/* [unique][in] */ IBindCtx *pbc,
|
||
|
/* [in] */ REFGUID bhid,
|
||
|
/* [in] */ REFIID riid,
|
||
|
/* [iid_is][out] */ void **ppv) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE GetParent(
|
||
|
/* [out] */ IShellItem **ppsi) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE GetDisplayName(
|
||
|
/* [in] */ SIGDN sigdnName,
|
||
|
/* [string][out] */ LPWSTR *ppszName) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE GetAttributes(
|
||
|
/* [in] */ SFGAOF sfgaoMask,
|
||
|
/* [out] */ SFGAOF *psfgaoAttribs) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE Compare(
|
||
|
/* [in] */ IShellItem *psi,
|
||
|
/* [in] */ SICHINTF hint,
|
||
|
/* [out] */ int *piOrder) = 0;
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif /* __IShellItem_INTERFACE_DEFINED__ */
|
||
|
|
||
|
//nclude "ObjectArray.h"
|
||
|
|
||
|
#ifndef __IObjectArray_INTERFACE_DEFINED__
|
||
|
#define __IObjectArray_INTERFACE_DEFINED__
|
||
|
|
||
|
MIDL_INTERFACE("92CA9DCD-5622-4bba-A805-5E9F541BD8C9")
|
||
|
IObjectArray : public IUnknown
|
||
|
{
|
||
|
public:
|
||
|
virtual HRESULT STDMETHODCALLTYPE GetCount(
|
||
|
/* [out] */ UINT *pcObjects) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE GetAt(
|
||
|
/* [in] */ UINT uiIndex,
|
||
|
/* [in] */ REFIID riid,
|
||
|
/* [iid_is][out] */ void **ppv) = 0;
|
||
|
|
||
|
};
|
||
|
#endif /* __IObjectArray_INTERFACE_DEFINED__ */
|
||
|
|
||
|
|
||
|
#ifndef __IObjectCollection_INTERFACE_DEFINED__
|
||
|
#define __IObjectCollection_INTERFACE_DEFINED__
|
||
|
|
||
|
/* interface IObjectCollection */
|
||
|
/* [unique][object][uuid] */
|
||
|
|
||
|
MIDL_INTERFACE("5632b1a4-e38a-400a-928a-d4cd63230295")
|
||
|
IObjectCollection : public IObjectArray
|
||
|
{
|
||
|
public:
|
||
|
virtual HRESULT STDMETHODCALLTYPE AddObject(
|
||
|
/* [in] */ IUnknown *punk) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE AddFromArray(
|
||
|
/* [in] */ IObjectArray *poaSource) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE RemoveObjectAt(
|
||
|
/* [in] */ UINT uiIndex) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE Clear( void) = 0;
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif /* __IObjectCollection_INTERFACE_DEFINED__ */
|
||
|
|
||
|
|
||
|
#ifndef __ICustomDestinationList_INTERFACE_DEFINED__
|
||
|
#define __ICustomDestinationList_INTERFACE_DEFINED__
|
||
|
|
||
|
/* interface ICustomDestinationList */
|
||
|
/* [unique][object][uuid] */
|
||
|
|
||
|
typedef /* [v1_enum] */
|
||
|
enum KNOWNDESTCATEGORY
|
||
|
{ KDC_FREQUENT = 1,
|
||
|
KDC_RECENT = ( KDC_FREQUENT + 1 )
|
||
|
} KNOWNDESTCATEGORY;
|
||
|
|
||
|
|
||
|
EXTERN_C const IID IID_IXTPCustomDestinationList;
|
||
|
|
||
|
|
||
|
MIDL_INTERFACE("6332debf-87b5-4670-90c0-5e57b408a49e")
|
||
|
ICustomDestinationList : public IUnknown
|
||
|
{
|
||
|
public:
|
||
|
virtual HRESULT STDMETHODCALLTYPE SetAppID(
|
||
|
/* [string][in] */ LPCWSTR pszAppID) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE BeginList(
|
||
|
/* [out] */ UINT *pcMinSlots,
|
||
|
/* [in] */ REFIID riid,
|
||
|
/* [iid_is][out] */ void **ppv) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE AppendCategory(
|
||
|
/* [string][in] */ LPCWSTR pszCategory,
|
||
|
/* [in] */ IObjectArray *poa) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE AppendKnownCategory(
|
||
|
/* [in] */ KNOWNDESTCATEGORY category) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE AddUserTasks(
|
||
|
/* [in] */ IObjectArray *poa) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE CommitList( void) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE GetRemovedDestinations(
|
||
|
/* [in] */ REFIID riid,
|
||
|
/* [iid_is][out] */ void **ppv) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE DeleteList(
|
||
|
/* [string][unique][in] */ LPCWSTR pszAppID) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE AbortList( void) = 0;
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif /* __ICustomDestinationList_INTERFACE_DEFINED__ */
|
||
|
|
||
|
#ifndef PROPERTYKEY_DEFINED
|
||
|
#define PROPERTYKEY_DEFINED
|
||
|
typedef struct _tagpropertykey
|
||
|
{
|
||
|
GUID fmtid;
|
||
|
DWORD pid;
|
||
|
} PROPERTYKEY;
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifndef _REFPROPVARIANT_DEFINED
|
||
|
#define REFPROPVARIANT const PROPVARIANT &
|
||
|
#endif
|
||
|
|
||
|
#define INITGUID
|
||
|
#include "propkey.h"
|
||
|
|
||
|
#ifndef __IPropertyStore_INTERFACE_DEFINED__
|
||
|
#define __IPropertyStore_INTERFACE_DEFINED__
|
||
|
|
||
|
/* interface IPropertyStore */
|
||
|
/* [unique][object][helpstring][uuid] */
|
||
|
|
||
|
|
||
|
|
||
|
EXTERN_C const IID IID_IXTPPropertyStore;
|
||
|
|
||
|
|
||
|
MIDL_INTERFACE("886d8eeb-8cf2-4446-8d02-cdba1dbdcf99")
|
||
|
IPropertyStore : public IUnknown
|
||
|
{
|
||
|
public:
|
||
|
virtual HRESULT STDMETHODCALLTYPE GetCount(
|
||
|
/* [out] */ DWORD *cProps) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE GetAt(
|
||
|
/* [in] */ DWORD iProp,
|
||
|
/* [out] */ PROPERTYKEY *pkey) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE GetValue(
|
||
|
/* [in] */ REFPROPERTYKEY key,
|
||
|
/* [out] */ PROPVARIANT *pv) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE SetValue(
|
||
|
/* [in] */ REFPROPERTYKEY key,
|
||
|
/* [in] */ REFPROPVARIANT propvar) = 0;
|
||
|
|
||
|
virtual HRESULT STDMETHODCALLTYPE Commit( void) = 0;
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif /* __IPropertyStore_INTERFACE_DEFINED__ */
|
||
|
|
||
|
const IID BASED_CODE IID_IXTPTaskbarList3 =
|
||
|
{ 0xea1afb91, 0x9e28, 0x4b86, { 0x90, 0xe9, 0x9e, 0x9f, 0x8a, 0x5e, 0xef, 0xaf } };
|
||
|
|
||
|
|
||
|
const CLSID BASED_CODE CLSID_XTPDestinationList =
|
||
|
{ 0x77f10cf0, 0x3db5, 0x4966, { 0xb5, 0x20, 0xb7, 0xc5, 0x4f, 0xd3, 0x5e, 0xd6 } };
|
||
|
|
||
|
const CLSID BASED_CODE CLSID_XTPEnumerableObjectCollection =
|
||
|
{ 0x2d3468c1, 0x36a7, 0x43b6, { 0xac, 0x24, 0xd3, 0xf0, 0x2f, 0xd9, 0x60, 0x7a } };
|
||
|
|
||
|
const IID BASED_CODE IID_IXTPObjectArray =
|
||
|
{ 0x92CA9DCD, 0x5622, 0x4bba, { 0xa8, 0x05, 0x5E, 0x9F, 0x54, 0x1B, 0xD8, 0xC9 } };
|
||
|
|
||
|
const IID BASED_CODE IID_IXTPCustomDestinationList =
|
||
|
{ 0x6332debf, 0x87b5, 0x4670, { 0x90, 0xc0, 0x5e, 0x57, 0xb4, 0x08, 0xa4, 0x9e } };
|
||
|
|
||
|
const IID BASED_CODE IID_IXTPObjectCollection =
|
||
|
{ 0x5632b1a4, 0xe38a, 0x400a, { 0x92, 0x8a, 0xd4, 0xcd, 0x63, 0x23, 0x02, 0x95 } };
|
||
|
|
||
|
const IID BASED_CODE IID_IXTPShellItem =
|
||
|
{ 0x43826d1e, 0xe718, 0x42ee, { 0xbc, 0x55, 0xa1, 0xe2, 0x61, 0xc3, 0x7b, 0xfe } };
|
||
|
|
||
|
const IID BASED_CODE IID_IXTPPropertyStore =
|
||
|
{ 0x886d8eeb, 0x8cf2, 0x4446, { 0x8d, 0x02, 0xcd, 0xba, 0x1d, 0xbd, 0xcf, 0x99 } };
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPTaskbarManagerJumpList
|
||
|
|
||
|
CXTPTaskbarManagerJumpList::CXTPTaskbarManagerJumpList()
|
||
|
{
|
||
|
m_pcdl = NULL;
|
||
|
m_poaRemoved = NULL;
|
||
|
|
||
|
#ifdef _XTP_ACTIVEX
|
||
|
EnableAutomation();
|
||
|
EnableTypeLib();
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
CXTPTaskbarManagerJumpList::~CXTPTaskbarManagerJumpList()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
void CXTPTaskbarManagerJumpList::BuildList()
|
||
|
{
|
||
|
HRESULT hr = CoCreateInstance(CLSID_XTPDestinationList, NULL, CLSCTX_INPROC_SERVER, IID_IXTPCustomDestinationList, (void**)&m_pcdl);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
UINT cMinSlots;
|
||
|
hr = m_pcdl->BeginList(&cMinSlots, IID_IXTPObjectArray, (void**)(&m_poaRemoved));
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = AddUserTasks();
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = m_pcdl->CommitList();
|
||
|
}
|
||
|
|
||
|
m_poaRemoved->Release();
|
||
|
m_poaRemoved = NULL;
|
||
|
}
|
||
|
m_pcdl->Release();
|
||
|
m_poaRemoved = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPTaskbarManagerJumpList::DeleteList()
|
||
|
{
|
||
|
HRESULT hr = CoCreateInstance(CLSID_XTPDestinationList, NULL, CLSCTX_INPROC_SERVER, IID_IXTPCustomDestinationList, (void**)(&m_pcdl));
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = m_pcdl->DeleteList(NULL);
|
||
|
m_pcdl->Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPTaskbarManagerJumpList::Clear()
|
||
|
{
|
||
|
m_arrTask.RemoveAll();
|
||
|
}
|
||
|
|
||
|
void CXTPTaskbarManagerJumpList::AddTask(LPCTSTR lpszPath, LPCTSTR lpszArgument, LPCTSTR lpszTitle, LPCTSTR lpszIconPath, int nIconIndex /*= -1*/)
|
||
|
{
|
||
|
CTask task;
|
||
|
task.m_strPath = lpszPath;
|
||
|
task.m_strArguments = lpszArgument;
|
||
|
task.m_strTitle = lpszTitle;
|
||
|
task.m_strIconPath = lpszIconPath;
|
||
|
task.m_nIconIndex = nIconIndex;
|
||
|
|
||
|
if (task.m_strPath.IsEmpty())
|
||
|
{
|
||
|
TCHAR szAppPath[MAX_PATH];
|
||
|
::GetModuleFileName(NULL, szAppPath, MAX_PATH);
|
||
|
|
||
|
task.m_strPath = szAppPath;
|
||
|
}
|
||
|
|
||
|
if (nIconIndex != -1 && task.m_strIconPath.IsEmpty())
|
||
|
{
|
||
|
task.m_strIconPath = task.m_strPath;
|
||
|
}
|
||
|
|
||
|
m_arrTask.Add(task);
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPTaskbarManagerJumpList::AddUserTasks()
|
||
|
{
|
||
|
IObjectCollection *poc;
|
||
|
HRESULT hr = CoCreateInstance(CLSID_XTPEnumerableObjectCollection, NULL, CLSCTX_INPROC, IID_IXTPObjectCollection, (void**)(&poc));
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
|
||
|
for (int i = 0; i < m_arrTask.GetSize(); i++)
|
||
|
{
|
||
|
const CTask& task = m_arrTask[i];
|
||
|
|
||
|
IShellLinkW *psl = NULL;
|
||
|
hr = CreateShellLink(XTP_CT2CW(task.m_strPath), XTP_CT2CW(task.m_strArguments),
|
||
|
XTP_CT2CW(task.m_strTitle), XTP_CT2CW(task.m_strIconPath), task.m_nIconIndex, &psl);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = poc->AddObject(psl);
|
||
|
psl->Release();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if (SUCCEEDED(hr) && m_arrTask.GetSize())
|
||
|
{
|
||
|
IObjectArray* poa;
|
||
|
hr = poc->QueryInterface(IID_IXTPObjectArray, (void**)(&poa));
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = m_pcdl->AddUserTasks(poa);
|
||
|
poa->Release();
|
||
|
}
|
||
|
}
|
||
|
poc->Release();
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CXTPTaskbarManagerJumpList::CreateShellLink(LPCWSTR lpszApp, LPCWSTR lpszCommandLine,
|
||
|
LPCWSTR lpszTitle, LPCWSTR lpszIconPath, int nIconIndex, IShellLinkW** ppSL)
|
||
|
{
|
||
|
IShellLinkW *psl;
|
||
|
HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**)(&psl));
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = psl->SetPath(lpszApp);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = psl->SetArguments(lpszCommandLine);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
if (nIconIndex != -1)
|
||
|
{
|
||
|
psl->SetIconLocation(lpszIconPath, nIconIndex);
|
||
|
}
|
||
|
|
||
|
IPropertyStore *pps;
|
||
|
hr = psl->QueryInterface(IID_IXTPPropertyStore, (void**)(&pps));
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
PROPVARIANT propvar;
|
||
|
propvar.vt = VT_BSTR;
|
||
|
propvar.pwszVal = SysAllocString(lpszTitle);
|
||
|
|
||
|
hr = pps->SetValue(PKEY_Title, propvar);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = pps->Commit();
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = psl->QueryInterface(IID_IShellLinkW, (void**)ppSL);
|
||
|
}
|
||
|
}
|
||
|
PropVariantClear(&propvar);
|
||
|
|
||
|
pps->Release();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||
|
}
|
||
|
psl->Release();
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CXTPTaskbarManagerJumpList::IsItemInArray(IShellItem* pSI, IObjectArray* pArray)
|
||
|
{
|
||
|
BOOL fRet = false;
|
||
|
UINT cItems;
|
||
|
if (SUCCEEDED(pArray->GetCount(&cItems)))
|
||
|
{
|
||
|
IShellItem *psiCompare;
|
||
|
for (UINT i = 0; !fRet && i < cItems; i++)
|
||
|
{
|
||
|
if (SUCCEEDED(pArray->GetAt(i, IID_IXTPShellItem, (void**)(&psiCompare))))
|
||
|
{
|
||
|
int iOrder;
|
||
|
fRet = SUCCEEDED(psiCompare->Compare(pSI, SICHINT_CANONICAL, &iOrder)) && (0 == iOrder);
|
||
|
psiCompare->Release();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return fRet;
|
||
|
}
|
||
|
|
||
|
void CXTPTaskbarManagerJumpList::CommitList()
|
||
|
{
|
||
|
DeleteList();
|
||
|
BuildList();
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPTaskbarManager
|
||
|
|
||
|
CXTPTaskbarManager::CXTPTaskbarManager()
|
||
|
{
|
||
|
m_nProgressBarRangeMin = 0;
|
||
|
m_nProgressBarRangeMax = 100;
|
||
|
|
||
|
|
||
|
m_pTaskbarList3 = NULL;
|
||
|
|
||
|
HRESULT hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_IXTPTaskbarList3, (void**)(&m_pTaskbarList3));
|
||
|
if (FAILED(hr) || m_pTaskbarList3 == NULL)
|
||
|
{
|
||
|
SAFE_RELEASE(m_pTaskbarList3);
|
||
|
}
|
||
|
|
||
|
|
||
|
m_pJumpList = new CXTPTaskbarManagerJumpList();
|
||
|
}
|
||
|
|
||
|
|
||
|
CXTPTaskbarManager::~CXTPTaskbarManager()
|
||
|
{
|
||
|
SAFE_RELEASE(m_pTaskbarList3);
|
||
|
|
||
|
CMDTARGET_RELEASE(m_pJumpList);
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CXTPTaskbarManager::SetOverlayIcon(HWND hWndParent, HICON hIcon, LPCTSTR lpszDescription)
|
||
|
{
|
||
|
if (!m_pTaskbarList3)
|
||
|
return FALSE;
|
||
|
|
||
|
if (FAILED(m_pTaskbarList3->SetOverlayIcon(hWndParent, hIcon, lpszDescription ? XTP_CT2CW(lpszDescription) : L"")))
|
||
|
return FALSE;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPTaskbarManager::SetOverlayIcon(HWND hWndParent, UINT nIDResource, LPCTSTR lpszDescription)
|
||
|
{
|
||
|
|
||
|
HICON hIcon = (HICON) LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(nIDResource),
|
||
|
IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS);
|
||
|
|
||
|
|
||
|
if (hIcon == NULL)
|
||
|
{
|
||
|
TRACE1("Can't load image from the resource with ID %d.", nIDResource);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL bResult = SetOverlayIcon(hWndParent, hIcon, lpszDescription);
|
||
|
DestroyIcon(hIcon);
|
||
|
|
||
|
return bResult;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CXTPTaskbarManager::SetProgressBarRange(HWND /*hWndParent*/, int nRangeMin, int nRangeMax)
|
||
|
{
|
||
|
m_nProgressBarRangeMax = nRangeMax;
|
||
|
m_nProgressBarRangeMin = nRangeMin;
|
||
|
}
|
||
|
|
||
|
void CXTPTaskbarManager::SetProgressBarPosition(HWND hWndParent, int nProgressPos)
|
||
|
{
|
||
|
if (!m_pTaskbarList3)
|
||
|
return;
|
||
|
|
||
|
m_pTaskbarList3->SetProgressValue(hWndParent, nProgressPos - m_nProgressBarRangeMin,
|
||
|
m_nProgressBarRangeMax - m_nProgressBarRangeMin);
|
||
|
}
|
||
|
|
||
|
void CXTPTaskbarManager::SetProgressBarState(HWND hWndParent, int nFlags)
|
||
|
{
|
||
|
if (!m_pTaskbarList3)
|
||
|
return;
|
||
|
|
||
|
m_pTaskbarList3->SetProgressState(hWndParent, (TBPFLAG)nFlags);
|
||
|
}
|
||
|
|
||
|
|
||
|
#ifdef _XTP_ACTIVEX
|
||
|
|
||
|
|
||
|
BEGIN_DISPATCH_MAP(CXTPTaskbarManagerJumpList, CCmdTarget)
|
||
|
|
||
|
DISP_FUNCTION_ID(CXTPTaskbarManagerJumpList, "AddTask", 1, AddTask, VT_EMPTY, VTS_BSTR VTS_BSTR VTS_BSTR VTS_BSTR VTS_I4)
|
||
|
|
||
|
DISP_FUNCTION_ID(CXTPTaskbarManagerJumpList, "Clear", 2, Clear, VT_EMPTY, VTS_NONE)
|
||
|
DISP_FUNCTION_ID(CXTPTaskbarManagerJumpList, "CommitList", 3, CommitList, VT_EMPTY, VTS_NONE)
|
||
|
|
||
|
END_DISPATCH_MAP()
|
||
|
|
||
|
// {AE890313-E400-4DA2-AEF5-CF1DD59DCD3B}
|
||
|
static const IID IID_ITreeViewNode =
|
||
|
{ 0xae890313, 0xe400, 0x4da2, { 0xae, 0xf5, 0xcf, 0x1d, 0xd5, 0x9d, 0xcd, 0x3b } };
|
||
|
|
||
|
BEGIN_INTERFACE_MAP(CXTPTaskbarManagerJumpList, CCmdTarget)
|
||
|
INTERFACE_PART(CXTPTaskbarManagerJumpList, IID_ITreeViewNode, Dispatch)
|
||
|
END_INTERFACE_MAP()
|
||
|
|
||
|
IMPLEMENT_OLETYPELIB_EX(CXTPTaskbarManagerJumpList, IID_ITreeViewNode)
|
||
|
|
||
|
|
||
|
#endif
|