Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369/* * PROJECT: ReactOS shell extensions * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) * PURPOSE: Quick Launch Toolbar (Taskbar Shell Extension) * COPYRIGHT: Copyright Shriraj Sawant a.k.a SR13 <sr.official@hotmail.com> */
#define WIN32_NO_STATUS#define _INC_WINDOWS#define COM_NO_WINDOWS_H
#define COBJMACROS
#include <windef.h>#include <winbase.h>#include <winreg.h>#include <wingdi.h>#include <winnls.h>#include <wincon.h>#include <shellapi.h>#include <shlobj.h>#include <shlobj_undoc.h>#include <shlwapi.h>#include <shlguid_undoc.h>#include <atlbase.h>#include <atlcom.h>#include <atlwin.h>
#include <undocshell.h>#include <shellutils.h>
#include "CQuickLaunchBand.h"
extern "C"HRESULT WINAPI RSHELL_CISFBand_CreateInstance(REFIID riid, void** ppv);
// {260CB95D-4544-44F6-A079-575BAA60B72F}const GUID CLSID_QuickLaunchBand = { 0x260cb95d, 0x4544, 0x44f6, { 0xa0, 0x79, 0x57, 0x5b, 0xaa, 0x60, 0xb7, 0x2f } };
// Componenet Category RegistrationHRESULT RegisterComCat(){ CComPtr<ICatRegister> pcr; HRESULT hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(ICatRegister, &pcr)); if (SUCCEEDED(hr)) { CATID catid = CATID_DeskBand; hr = pcr->RegisterClassImplCategories(CLSID_QuickLaunchBand, 1, &catid); } return hr;}
HRESULT UnregisterComCat(){ CComPtr<ICatRegister> pcr; HRESULT hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(ICatRegister, &pcr)); if (SUCCEEDED(hr)) { CATID catid = CATID_DeskBand; hr = pcr->UnRegisterClassImplCategories(CLSID_QuickLaunchBand, 1, &catid); } return hr;}
// Pidl Browser/*++* @name PidlBrowse** Opens a folder browser dialog,* allowing the user to select a folder for enumeration.** @param hwnd* A handle to browser dialog window.* @param nCSIDL* A CSIDL representing the root from which the browse folder dialog shows the files and folders.** @return The PIDL to selected folder.**--*/LPITEMIDLIST PidlBrowse(HWND hwnd, int nCSIDL){ CComHeapPtr<ITEMIDLIST> pidlRoot;
WCHAR path[MAX_PATH];
if (nCSIDL) { SHGetSpecialFolderLocation(hwnd, nCSIDL, &pidlRoot); }
BROWSEINFO bi = { hwnd, pidlRoot, path, L"Choose a folder", 0, NULL, 0, 0 }; LPITEMIDLIST pidlSelected = SHBrowseForFolder(&bi);
return pidlSelected;}
// CQuickLaunchBand
CQuickLaunchBand::CQuickLaunchBand() {}
CQuickLaunchBand::~CQuickLaunchBand() {}
/*****************************************************************************/// ATL Construct/*++* @name FinalConstruct** Creates an instance of CISFBand, and initializes its Shell Folder Band for enumeration.** @return The error code.**--*/HRESULT CQuickLaunchBand::FinalConstruct(){ HRESULT hr = RSHELL_CISFBand_CreateInstance(IID_PPV_ARG(IUnknown, &m_punkISFB)); if (FAILED_UNEXPECTEDLY(hr)) return hr;
CComPtr<IShellFolderBand> pISFB; hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IShellFolderBand, &pISFB)); if (FAILED_UNEXPECTEDLY(hr)) return hr;
CComPtr<IShellFolder> pISF; hr = SHGetDesktopFolder(&pISF); if (FAILED_UNEXPECTEDLY(hr)) return hr;
CComHeapPtr<ITEMIDLIST> pidl(PidlBrowse(m_hWndBro, CSIDL_DESKTOP)); if (pidl == NULL) return E_FAIL; pISFB->InitializeSFB(pISF, pidl);
return hr;}
// IObjectWithSiteSTDMETHODIMP CQuickLaunchBand::SetSite(IUnknown *pUnkSite){ // Internal CISFBand Calls CComPtr<IObjectWithSite> pIOWS; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IObjectWithSite, &pIOWS)); if (FAILED(hr)) return hr;
return pIOWS->SetSite(pUnkSite);}
STDMETHODIMP CQuickLaunchBand::GetSite(IN REFIID riid, OUT VOID **ppvSite){ CComPtr<IObjectWithSite> pIOWS; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IObjectWithSite, &pIOWS)); if (FAILED(hr)) return hr;
return pIOWS->GetSite(riid, ppvSite);}
/*****************************************************************************/// IDeskBandSTDMETHODIMP CQuickLaunchBand::GetWindow(OUT HWND *phwnd){ // Internal CISFBand Calls CComPtr<IDeskBand> pIDB; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IDeskBand, &pIDB)); if (FAILED(hr)) return hr;
return pIDB->GetWindow(phwnd);}
STDMETHODIMP CQuickLaunchBand::ContextSensitiveHelp(IN BOOL fEnterMode){ // Internal CISFBand Calls CComPtr<IDeskBand> pIDB; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IDeskBand, &pIDB)); if (FAILED(hr)) return hr;
return pIDB->ContextSensitiveHelp(fEnterMode);}
STDMETHODIMP CQuickLaunchBand::ShowDW(IN BOOL bShow){ // Internal CISFBand Calls CComPtr<IDeskBand> pIDB; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IDeskBand, &pIDB)); if (FAILED(hr)) return hr;
return pIDB->ShowDW(bShow);}
STDMETHODIMP CQuickLaunchBand::CloseDW(IN DWORD dwReserved){ // Internal CISFBand Calls CComPtr<IDeskBand> pIDB; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IDeskBand, &pIDB)); if (FAILED(hr)) return hr;
return pIDB->CloseDW(dwReserved);}
STDMETHODIMP CQuickLaunchBand::ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved){ // Internal CISFBand Calls CComPtr<IDeskBand> pIDB; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IDeskBand, &pIDB)); if (FAILED(hr)) return hr;
return pIDB->ResizeBorderDW(prcBorder, punkToolbarSite, fReserved);}
STDMETHODIMP CQuickLaunchBand::GetBandInfo(IN DWORD dwBandID, IN DWORD dwViewMode, IN OUT DESKBANDINFO *pdbi){ // Internal CISFBand Calls CComPtr<IDeskBand> pIDB; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IDeskBand, &pIDB)); if (FAILED(hr)) return hr;
return pIDB->GetBandInfo(dwBandID, dwViewMode, pdbi);}
/*****************************************************************************/// IPersistStreamSTDMETHODIMP CQuickLaunchBand::GetClassID(OUT CLSID *pClassID){ // Internal CISFBand Calls CComPtr<IPersistStream> pIPS; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IPersistStream, &pIPS)); if (FAILED(hr)) return hr;
return pIPS->GetClassID(pClassID);}
STDMETHODIMP CQuickLaunchBand::IsDirty(){ // Internal CISFBand Calls CComPtr<IPersistStream> pIPS; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IPersistStream, &pIPS)); if (FAILED(hr)) return hr;
return pIPS->IsDirty();}
STDMETHODIMP CQuickLaunchBand::Load(IN IStream *pStm){ CComPtr<IPersistStream> pIPS; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IPersistStream, &pIPS)); if (FAILED(hr)) return hr;
return pIPS->Load(pStm);}
STDMETHODIMP CQuickLaunchBand::Save(IN IStream *pStm, IN BOOL fClearDirty){ // Internal CISFBand Calls CComPtr<IPersistStream> pIPS; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IPersistStream, &pIPS)); if (FAILED(hr)) return hr;
return pIPS->Save(pStm, fClearDirty);}
STDMETHODIMP CQuickLaunchBand::GetSizeMax(OUT ULARGE_INTEGER *pcbSize){ CComPtr<IPersistStream> pIPS; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IPersistStream, &pIPS)); if (FAILED(hr)) return hr;
return pIPS->GetSizeMax(pcbSize);}
/*****************************************************************************/// IWinEventHandlerSTDMETHODIMP CQuickLaunchBand::ContainsWindow(IN HWND hWnd){ return E_NOTIMPL;}
STDMETHODIMP CQuickLaunchBand::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult){ // Internal CISFBand Calls CComPtr<IWinEventHandler> pWEH; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IWinEventHandler, &pWEH)); if (FAILED(hr)) return hr;
return pWEH->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult);}
STDMETHODIMP CQuickLaunchBand::IsWindowOwner(HWND hWnd){ // Internal CISFBand Calls CComPtr<IWinEventHandler> pWEH; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IWinEventHandler, &pWEH)); if (FAILED(hr)) return hr;
return pWEH->IsWindowOwner(hWnd);}
/*****************************************************************************/// *** IOleCommandTarget methods ***STDMETHODIMP CQuickLaunchBand::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText){ // Internal CISFBand Calls CComPtr<IOleCommandTarget> pOCT; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &pOCT)); if (FAILED(hr)) return hr;
return pOCT->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText);}
STDMETHODIMP CQuickLaunchBand::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut){ // Internal CISFBand Calls CComPtr<IOleCommandTarget> pOCT; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &pOCT)); if (FAILED(hr)) return hr;
return pOCT->Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);}
/*****************************************************************************/// *** IContextMenu ***STDMETHODIMP CQuickLaunchBand::GetCommandString(UINT_PTR idCmd, UINT uFlags, UINT *pwReserved, LPSTR pszName, UINT cchMax){ // Internal CISFBand Calls CComPtr<IContextMenu> pICM; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IContextMenu, &pICM)); if (FAILED(hr)) return hr;
return pICM->GetCommandString(idCmd, uFlags, pwReserved, pszName, cchMax);}
STDMETHODIMP CQuickLaunchBand::InvokeCommand(LPCMINVOKECOMMANDINFO pici){ // Internal CISFBand Calls CComPtr<IContextMenu> pICM; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IContextMenu, &pICM)); if (FAILED(hr)) return hr;
return pICM->InvokeCommand(pici);}
STDMETHODIMP CQuickLaunchBand::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags){ // Internal CISFBand Calls CComPtr<IContextMenu> pICM; HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IContextMenu, &pICM)); if (FAILED(hr)) return hr;
return pICM->QueryContextMenu(hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags);}