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);
}
示例#2
0
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;
}
示例#3
0
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;
}
示例#4
0
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;
}
示例#5
0
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);
			}
		}
	}
}