📄 tbsite.c
字号:
hWnd,
uMsg,
wParam,
lParam,
plResult);
if (!SUCCEEDED(hRet))
{
if (uMsg == WM_NOTIFY)
{
const NMHDR *nmh = (const NMHDR *)lParam;
DbgPrint("ITrayBandSite->IWindowEventHandler::ProcessMessage: WM_NOTIFY for 0x%p, From: 0x%p, Code: NM_FIRST-%u returned 0x%x\n", hWnd, nmh->hwndFrom, NM_FIRST - nmh->code, hRet);
}
else
{
DbgPrint("ITrayBandSite->IWindowEventHandler::ProcessMessage(0x%p,0x%x,0x%p,0x%p,0x%p->0x%p) returned: 0x%x\n", hWnd, uMsg, wParam, lParam, plResult, *plResult, hRet);
}
}
}
else
hRet = E_FAIL;
return hRet;
}
static HRESULT STDMETHODCALLTYPE
ITrayBandSiteImpl_AddContextMenus(IN OUT ITrayBandSite *iface,
IN HMENU hmenu,
IN UINT indexMenu,
IN UINT idCmdFirst,
IN UINT idCmdLast,
IN UINT uFlags,
OUT IContextMenu **ppcm)
{
ITrayBandSiteImpl *This = ITrayBandSiteImpl_from_ITrayBandSite(iface);
IShellService *pSs;
HRESULT hRet;
if (This->ContextMenu == NULL)
{
/* Cache the context menu so we don't need to CoCreateInstance all the time... */
hRet = CoCreateInstance(&CLSID_IShellBandSiteMenu,
NULL,
CLSCTX_INPROC_SERVER,
&IID_IShellService,
(PVOID*)&pSs);
DbgPrint("CoCreateInstance(CLSID_IShellBandSiteMenu) for IShellService returned: 0x%x\n", hRet);
if (!SUCCEEDED(hRet))
return hRet;
hRet = IShellService_SetOwner(pSs,
IUnknown_from_ITrayBandSiteImpl(This));
if (!SUCCEEDED(hRet))
{
IShellService_Release(pSs);
return hRet;
}
hRet = IShellService_QueryInterface(pSs,
&IID_IContextMenu,
(PVOID*)&This->ContextMenu);
IShellService_Release(pSs);
if (!SUCCEEDED(hRet))
return hRet;
}
if (ppcm != NULL)
{
IContextMenu_AddRef(This->ContextMenu);
*ppcm = This->ContextMenu;
}
/* Add the menu items */
return IContextMenu_QueryContextMenu(This->ContextMenu,
hmenu,
indexMenu,
idCmdFirst,
idCmdLast,
uFlags);
}
static HRESULT STDMETHODCALLTYPE
ITrayBandSiteImpl_Lock(IN OUT ITrayBandSite *iface,
IN BOOL bLock)
{
ITrayBandSiteImpl *This = ITrayBandSiteImpl_from_ITrayBandSite(iface);
BOOL bPrevLocked = This->Locked;
BANDSITEINFO bsi;
HRESULT hRet;
ASSERT(This->BandSite != NULL);
if (bPrevLocked != bLock)
{
This->Locked = bLock;
bsi.dwMask = BSIM_STYLE;
bsi.dwStyle = (This->Locked ? BSIS_LOCKED | BSIS_NOGRIPPER : BSIS_AUTOGRIPPER);
hRet = IBandSite_SetBandSiteInfo(This->BandSite,
&bsi);
if (SUCCEEDED(hRet))
{
hRet = ITrayBandSiteImpl_Update(This);
}
return hRet;
}
return S_FALSE;
}
static const ITrayBandSiteVtbl ITrayBandSiteImpl_Vtbl =
{
/*** IUnknown methods ***/
ITrayBandSiteImpl_QueryInterface,
ITrayBandSiteImpl_AddRef,
ITrayBandSiteImpl_Release,
/*** IBandSiteStreamCallback methods ***/
ITrayBandSiteImpl_OnLoad,
ITrayBandSiteImpl_OnSave,
/*** ITrayBandSite methods ***/
ITrayBandSiteImpl_IsTaskBand,
ITrayBandSiteImpl_ProcessMessage,
ITrayBandSiteImpl_AddContextMenus,
ITrayBandSiteImpl_Lock
};
/*******************************************************************/
METHOD_IUNKNOWN_INHERITED_ADDREF(IBandSite, ITrayBandSite)
METHOD_IUNKNOWN_INHERITED_RELEASE(IBandSite, ITrayBandSite)
METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IBandSite, ITrayBandSite)
static HRESULT STDMETHODCALLTYPE
ITrayBandSiteImpl_AddBand(IN OUT IBandSite *iface,
IN IUnknown *punk)
{
ITrayBandSiteImpl *This = ITrayBandSiteImpl_from_IBandSite(iface);
IOleCommandTarget *pOct;
HRESULT hRet;
hRet = IUnknown_QueryInterface(punk,
&IID_IOleCommandTarget,
(PVOID*)&pOct);
if (SUCCEEDED(hRet))
{
/* Send the DBID_DELAYINIT command to initialize the band to be added */
/* FIXME: Should be delayed */
IOleCommandTarget_Exec(pOct,
&IID_IDeskBand,
DBID_DELAYINIT,
0,
NULL,
NULL);
IOleCommandTarget_Release(pOct);
}
return IBandSite_AddBand(This->BandSite,
punk);
}
static HRESULT STDMETHODCALLTYPE
ITrayBandSiteImpl_EnumBands(IN OUT IBandSite *iface,
IN UINT uBand,
OUT DWORD *pdwBandID)
{
ITrayBandSiteImpl *This = ITrayBandSiteImpl_from_IBandSite(iface);
return IBandSite_EnumBands(This->BandSite,
uBand,
pdwBandID);
}
static HRESULT STDMETHODCALLTYPE
ITrayBandSiteImpl_QueryBand(IN OUT IBandSite *iface,
IN DWORD dwBandID,
OUT IDeskBand **ppstb,
OUT DWORD *pdwState,
OUT LPWSTR pszName,
IN int cchName)
{
HRESULT hRet;
IDeskBand *pstb = NULL;
ITrayBandSiteImpl *This = ITrayBandSiteImpl_from_IBandSite(iface);
hRet = IBandSite_QueryBand(This->BandSite,
dwBandID,
&pstb,
pdwState,
pszName,
cchName);
if (SUCCEEDED(hRet))
{
hRet = IsSameObject((IUnknown *)pstb,
(IUnknown *)This->TaskBand);
if (hRet == S_OK)
{
/* Add the BSSF_UNDELETEABLE flag to pdwState because the task bar band shouldn't be deletable */
if (pdwState != NULL)
*pdwState |= BSSF_UNDELETEABLE;
}
else if (!SUCCEEDED(hRet))
{
IDeskBand_Release(pstb);
pstb = NULL;
}
if (ppstb != NULL)
*ppstb = pstb;
}
return hRet;
}
static HRESULT STDMETHODCALLTYPE
ITrayBandSiteImpl_SetBandState(IN OUT IBandSite *iface,
IN DWORD dwBandID,
IN DWORD dwMask,
IN DWORD dwState)
{
ITrayBandSiteImpl *This = ITrayBandSiteImpl_from_IBandSite(iface);
return IBandSite_SetBandState(This->BandSite,
dwBandID,
dwMask,
dwState);
}
static HRESULT STDMETHODCALLTYPE
ITrayBandSiteImpl_RemoveBand(IN OUT IBandSite *iface,
IN DWORD dwBandID)
{
ITrayBandSiteImpl *This = ITrayBandSiteImpl_from_IBandSite(iface);
return IBandSite_RemoveBand(This->BandSite,
dwBandID);
}
static HRESULT STDMETHODCALLTYPE
ITrayBandSiteImpl_GetBandObject(IN OUT IBandSite *iface,
IN DWORD dwBandID,
IN REFIID riid,
OUT VOID **ppv)
{
ITrayBandSiteImpl *This = ITrayBandSiteImpl_from_IBandSite(iface);
return IBandSite_GetBandObject(This->BandSite,
dwBandID,
riid,
ppv);
}
static HRESULT STDMETHODCALLTYPE
ITrayBandSiteImpl_SetBandSiteInfo(IN OUT IBandSite *iface,
IN const BANDSITEINFO *pbsinfo)
{
ITrayBandSiteImpl *This = ITrayBandSiteImpl_from_IBandSite(iface);
return IBandSite_SetBandSiteInfo(This->BandSite,
pbsinfo);
}
static HRESULT STDMETHODCALLTYPE
ITrayBandSiteImpl_GetBandSiteInfo(IN OUT IBandSite *iface,
IN OUT BANDSITEINFO *pbsinfo)
{
ITrayBandSiteImpl *This = ITrayBandSiteImpl_from_IBandSite(iface);
return IBandSite_GetBandSiteInfo(This->BandSite,
pbsinfo);
}
static const IBandSiteVtbl IBandSiteImpl_Vtbl =
{
/*** IUnknown methods ***/
METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IBandSite, ITrayBandSite),
METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IBandSite, ITrayBandSite),
METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IBandSite, ITrayBandSite),
/*** IBandSite methods ***/
ITrayBandSiteImpl_AddBand,
ITrayBandSiteImpl_EnumBands,
ITrayBandSiteImpl_QueryBand,
ITrayBandSiteImpl_SetBandState,
ITrayBandSiteImpl_RemoveBand,
ITrayBandSiteImpl_GetBandObject,
ITrayBandSiteImpl_SetBandSiteInfo,
ITrayBandSiteImpl_GetBandSiteInfo,
};
static BOOL
ITrayBandSiteImpl_HasTaskBand(IN OUT ITrayBandSiteImpl *This)
{
ASSERT(This->TaskBand != NULL);
return SUCCEEDED(ITaskBand_GetRebarBandID(This->TaskBand,
NULL));
}
static HRESULT
ITrayBandSiteImpl_AddTaskBand(IN OUT ITrayBandSiteImpl *This)
{
#if 0
/* FIXME: This is the code for the simple taskbar */
IObjectWithSite *pOws;
HRESULT hRet;
hRet = ITaskBand_QueryInterface(This->TaskBand,
&IID_IObjectWithSite,
(PVOID*)&pOws);
if (SUCCEEDED(hRet))
{
hRet = IObjectWithSite_SetSite(pOws,
(IUnknown *)This->TaskBand);
IObjectWithSite_Release(pOws);
}
return hRet;
#else
if (!ITrayBandSiteImpl_HasTaskBand(This))
{
return IBandSite_AddBand(This->BandSite,
(IUnknown *)This->TaskBand);
}
return S_OK;
#endif
}
static HRESULT
ITrayBandSiteImpl_Update(IN OUT ITrayBandSiteImpl *This)
{
IOleCommandTarget *pOct;
HRESULT hRet;
hRet = IUnknown_QueryInterface(This->punkInner,
&IID_IOleCommandTarget,
(PVOID*)&pOct);
if (SUCCEEDED(hRet))
{
/* Send the DBID_BANDINFOCHANGED command to update the band site */
hRet = IOleCommandTarget_Exec(pOct,
&IID_IDeskBand,
DBID_BANDINFOCHANGED,
0,
NULL,
NULL);
IOleCommandTarget_Release(pOct);
}
return hRet;
}
static VOID
ITrayBandSiteImpl_BroadcastOleCommandExec(IN OUT ITrayBandSiteImpl *This,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -