LRESULT CALLBACK Explorerplusplus::MainWndTaskbarThumbnailProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { if(uMsg == m_uTaskbarButtonCreatedMessage) { if(m_pTaskbarList != NULL) { m_pTaskbarList->Release(); } CoCreateInstance(CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pTaskbarList)); m_pTaskbarList->HrInit(); m_bTaskbarInitialised = TRUE; /* Add each of the jump list tasks. */ SetupJumplistTasks(); /* Register each of the tabs. */ for(auto itr = m_TabProxyList.begin();itr != m_TabProxyList.end();itr++) { BOOL bActive = (itr->iTabId == m_iObjectIndex); RegisterTab(itr->hProxy,EMPTY_STRING,bActive); HandleTabText(itr->iTabId); SetTabIcon(itr->iTabId); } RemoveWindowSubclass(hwnd,MainWndProcStub,0); return 0; } return DefSubclassProc(hwnd,uMsg,wParam,lParam); }
unsigned TaskbarPreviews::addTab(QWidget *tab, QWidget *owner, const QString &title, QWidget *before, PreviewProvider *pp) { _tab t; t.internalTabWidget = new QWidget; t.pp = pp; t.userTabWidget = tab; t.tabHandle = (HWND)t.internalTabWidget->winId(); t.userTabOwner = owner; t.type = (tab->window() == tab) ? ttWindow : ttWidget; if (!title.isNull()) t.internalTabWidget->setWindowTitle(title); else t.internalTabWidget->setWindowTitle(t.userTabOwner->windowTitle()); HWND afterHwnd = before ? reinterpret_cast<HWND>(m_tabs.internal(before)->winId()) : 0; // will return zero if after == 0 or there's no such tab, in that cases tab will be added to the end if (tab->window() == tab) { if(pp){ ForceIconicRepresentation((HWND)t.internalTabWidget->winId()); } } else // tab is not a window so previews must be created by library or user anyway ForceIconicRepresentation((HWND)t.internalTabWidget->winId()); m_tabs.append(t); RegisterTab(t.tabHandle, (HWND)owner->winId()); SetTabOrder(t.tabHandle, afterHwnd); return t.id; }
STDMETHODIMP CTaskbar7::SetTabActive() { // Do nothing on XP & Vista if (!m_isWindows7) return S_OK; // Do nothing if we don't have the main hwnd if (!m_parentHwnd) return S_OK; RegisterTab(); m_pTaskbarList->SetTabActive(m_hwnd, m_parentHwnd, 0); return S_OK; }
STDMETHODIMP CTaskbar7::ConfigureTab(BSTR name, LONG after) { // Do nothing on XP & Vista if (!m_isWindows7) return S_OK; // If running anything other than a gadget, do nothing if (!m_parentHwnd) return S_OK; // Update name USES_CONVERSION; SetWindowText(m_hwnd, OLE2CA(name)); RegisterTab(); HRESULT hr = m_pTaskbarList->SetTabOrder(m_hwnd, (HWND)after); return hr; }
unsigned TaskbarPreviews::addVirtualTab(PreviewProvider *pp, QWidget *owner, const QString &title, QWidget *before) { _tab t; t.internalTabWidget = new QWidget; t.pp = pp; t.userTabWidget = 0; t.tabHandle = (HWND)t.internalTabWidget->winId(); t.userTabOwner = owner; t.type = ttVirtual; if (!title.isNull()) t.internalTabWidget->setWindowTitle(title); else t.internalTabWidget->setWindowTitle(t.userTabOwner->windowTitle()); HWND afterHwnd = before ? reinterpret_cast<HWND>(m_tabs.internal(before)->winId()) : 0; ForceIconicRepresentation((HWND)t.internalTabWidget->winId()); m_tabs.append(t); RegisterTab(t.tabHandle, (HWND)owner->winId()); SetTabOrder(t.tabHandle, afterHwnd); return t.id; }
/* The Display Window Manager (DWM) will only interact with top-level windows. Therefore, we'll need to create a top-level proxy window for every tab. This top-level window will be hidden, and will handle the thumbnail preview for the tab. References: http://dotnet.dzone.com/news/windows-7-taskbar-tabbed http://channel9.msdn.com/learn/courses/Windows7/Taskbar/Win7TaskbarNative/Exercise-Experiment-with-the-New-Windows-7-Taskbar-Features/ */ void Explorerplusplus::CreateTabProxy(int iTabId,BOOL bSwitchToNewTab) { HWND hTabProxy; TabProxyInfo_t tpi; TCHAR szClassName[512]; ATOM aRet; BOOL bValue = TRUE; /* If we're not running on Windows 7 or later, return without doing anything. */ if((m_dwMajorVersion == WINDOWS_VISTA_SEVEN_MAJORVERSION && m_dwMinorVersion == 0) || m_dwMajorVersion < WINDOWS_VISTA_SEVEN_MAJORVERSION) { return; } if(!m_bShowTaskbarThumbnails) { return; } static int iCount = 0; StringCchPrintf(szClassName,SIZEOF_ARRAY(szClassName),_T("Explorer++TabProxy%d"),iCount++); aRet = RegisterTabProxyClass(szClassName); if(aRet != 0) { TabProxy_t *ptp = NULL; ptp = (TabProxy_t *)malloc(sizeof(TabProxy_t)); ptp->pContainer = this; ptp->iTabId = iTabId; hTabProxy = CreateWindow(szClassName,EMPTY_STRING,WS_OVERLAPPEDWINDOW, 0,0,0,0,NULL,NULL,GetModuleHandle(0),(LPVOID)ptp); if(hTabProxy != NULL) { HMODULE hDwmapi; DwmSetWindowAttributeProc DwmSetWindowAttribute; hDwmapi = LoadLibrary(_T("dwmapi.dll")); if(hDwmapi != NULL) { DwmSetWindowAttribute = (DwmSetWindowAttributeProc)GetProcAddress(hDwmapi,"DwmSetWindowAttribute"); if(DwmSetWindowAttribute != NULL) { DwmSetWindowAttribute(hTabProxy,DWMWA_FORCE_ICONIC_REPRESENTATION, &bValue,sizeof(BOOL)); DwmSetWindowAttribute(hTabProxy,DWMWA_HAS_ICONIC_BITMAP, &bValue,sizeof(BOOL)); if(m_bTaskbarInitialised) { RegisterTab(hTabProxy,EMPTY_STRING,bSwitchToNewTab); } tpi.hProxy = hTabProxy; tpi.iTabId = iTabId; tpi.atomClass = aRet; m_TabProxyList.push_back(tpi); } FreeLibrary(hDwmapi); } } } }