#include "priv.h" #include "resource.h" #include class TaskbarList : public ITaskbarList2 { public: TaskbarList(); // IUnknown Methods STDMETHODIMP QueryInterface(REFIID,void **); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // ITaskbarList Methods STDMETHODIMP HrInit(void); STDMETHODIMP AddTab(HWND hwnd); STDMETHODIMP DeleteTab(HWND hwnd); STDMETHODIMP ActivateTab(HWND hwnd); STDMETHODIMP SetActiveAlt(HWND hwnd); // ITaskbarList2 Methods STDMETHODIMP MarkFullscreenWindow(HWND hwnd, BOOL fFullscreen); protected: ~TaskbarList(); HWND _HwndGetTaskbarList(void); UINT _cRef; HWND _hwndTaskbarList; int _wm_shellhook; }; ////////////////////////////////////////////////////////////////////////////// // // TaskbarList Object // ////////////////////////////////////////////////////////////////////////////// STDAPI TaskbarList_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppunk, LPCOBJECTINFO poi) { // aggregation checking is handled in class factory TaskbarList *pTL = new TaskbarList(); if (pTL) { *ppunk = SAFECAST(pTL, IUnknown *); return S_OK; } return E_OUTOFMEMORY; } TaskbarList::TaskbarList() { _cRef = 1; _hwndTaskbarList = NULL; _wm_shellhook = RegisterWindowMessage(TEXT("SHELLHOOK")); DllAddRef(); } TaskbarList::~TaskbarList() { ASSERT(_cRef == 0); // should always have zero DllRelease(); } HWND TaskbarList::_HwndGetTaskbarList(void) { if (_hwndTaskbarList && IsWindow(_hwndTaskbarList)) return _hwndTaskbarList; _hwndTaskbarList = FindWindow(TEXT("Shell_TrayWnd"), NULL); if (_hwndTaskbarList) _hwndTaskbarList = (HWND)SendMessage(_hwndTaskbarList, WMTRAY_QUERY_VIEW, 0, 0); return _hwndTaskbarList; } ////////////////////////////////// // // IUnknown Methods... // HRESULT TaskbarList::QueryInterface(REFIID iid, void **ppv) { static const QITAB qit[] = { QITABENT(TaskbarList, ITaskbarList), QITABENT(TaskbarList, ITaskbarList2), { 0 }, }; return QISearch(this, qit, iid, ppv); } ULONG TaskbarList::AddRef() { return ++_cRef; } ULONG TaskbarList::Release() { if (--_cRef) return _cRef; delete this; return 0; } ////////////////////////////////// // // ITaskbarList Methods... // HRESULT TaskbarList::HrInit(void) { HWND hwndTL = _HwndGetTaskbarList(); if (hwndTL == NULL) return E_NOTIMPL; return S_OK; } HRESULT TaskbarList::AddTab(HWND hwnd) { HWND hwndTL = _HwndGetTaskbarList(); if (hwndTL) SendMessage(hwndTL, _wm_shellhook, HSHELL_WINDOWCREATED, (LPARAM) hwnd); return S_OK; } HRESULT TaskbarList::DeleteTab(HWND hwnd) { HWND hwndTL = _HwndGetTaskbarList(); if (hwndTL) SendMessage(hwndTL, _wm_shellhook, HSHELL_WINDOWDESTROYED, (LPARAM) hwnd); return S_OK; } HRESULT TaskbarList::ActivateTab(HWND hwnd) { HWND hwndTL = _HwndGetTaskbarList(); if (hwndTL) { SendMessage(hwndTL, _wm_shellhook, HSHELL_WINDOWACTIVATED, (LPARAM) hwnd); SendMessage(hwndTL, TBC_SETACTIVEALT , 0, (LPARAM) hwnd); } return S_OK; } HRESULT TaskbarList::SetActiveAlt(HWND hwnd) { HWND hwndTL = _HwndGetTaskbarList(); if (hwndTL) SendMessage(hwndTL, TBC_SETACTIVEALT , 0, (LPARAM) hwnd); return S_OK; } HRESULT TaskbarList::MarkFullscreenWindow(HWND hwnd, BOOL fFullscreen) { if (GetUIVersion() >= 6) { HWND hwndTL = _HwndGetTaskbarList(); if (hwndTL) SendMessage(hwndTL, TBC_MARKFULLSCREEN, (WPARAM) fFullscreen, (LPARAM) hwnd); return S_OK; } return E_FAIL; // ITaskbarList2 not supported downlevel };