⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tbsite.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 3 页
字号:
                                                  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 + -