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

📄 taskband.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 2 页
字号:
    ITaskBandImpl_CloseDW,
    ITaskBandImpl_ResizeBoderDW,
    /*** IDeskBand methods ***/
    ITaskBandImpl_GetBandInfo
};

/*****************************************************************************/

METHOD_IUNKNOWN_INHERITED_ADDREF(IDeskBar, ITaskBand)
METHOD_IUNKNOWN_INHERITED_RELEASE(IDeskBar, ITaskBand)
METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IDeskBar, ITaskBand)

static HRESULT STDMETHODCALLTYPE
IDeskBarImpl_GetWindow(IN OUT IDeskBar *iface,
                       OUT HWND *phwnd)
{
    ITaskBandImpl *This = ITaskBandImpl_from_IDeskBar(iface);
    IDeskBand *DeskBand = IDeskBand_from_ITaskBandImpl(This);

    /* Proxy to IDeskBand interface */
    return IDeskBand_GetWindow(DeskBand,
                               phwnd);
}

static HRESULT STDMETHODCALLTYPE
IDeskBarImpl_ContextSensitiveHelp(IN OUT IDeskBar *iface,
                                  IN BOOL fEnterMode)
{
    ITaskBandImpl *This = ITaskBandImpl_from_IDeskBar(iface);
    IDeskBand *DeskBand = IDeskBand_from_ITaskBandImpl(This);

    /* Proxy to IDeskBand interface */
    return IDeskBand_ContextSensitiveHelp(DeskBand,
                                          fEnterMode);
}

static HRESULT STDMETHODCALLTYPE
IDeskBarImpl_SetClient(IN OUT IDeskBar *iface,
                       IN IUnknown *punkClient)
{
    DbgPrint("IDeskBar::SetClient(0x%p)\n", punkClient);
    return E_NOTIMPL;
}

static HRESULT STDMETHODCALLTYPE
IDeskBarImpl_GetClient(IN OUT IDeskBar *iface,
                       OUT IUnknown **ppunkClient)
{
    DbgPrint("IDeskBar::GetClient(0x%p)\n", ppunkClient);
    return E_NOTIMPL;
}

static HRESULT STDMETHODCALLTYPE
IDeskBarImpl_OnPosRectChangeDB(IN OUT IDeskBar *iface,
                               IN RECT *prc)
{
    DbgPrint("IDeskBar::OnPosRectChangeDB(0x%p=(%d,%d,%d,%d))\n", prc, prc->left, prc->top, prc->right, prc->bottom);
    if (prc->bottom - prc->top == 0)
        return S_OK;

    return S_FALSE;
}

static const IDeskBarVtbl IDeskBarImpl_Vtbl =
{
    /*** IUnknown methods ***/
    METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IDeskBar, ITaskBand),
    METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IDeskBar, ITaskBand),
    METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IDeskBar, ITaskBand),
    /*** IOleWindow methods ***/
    IDeskBarImpl_GetWindow,
    IDeskBarImpl_ContextSensitiveHelp,
    /*** IDeskBar methods ***/
    IDeskBarImpl_SetClient,
    IDeskBarImpl_GetClient,
    IDeskBarImpl_OnPosRectChangeDB
};

/*****************************************************************************/

METHOD_IUNKNOWN_INHERITED_ADDREF(IPersistStream, ITaskBand)
METHOD_IUNKNOWN_INHERITED_RELEASE(IPersistStream, ITaskBand)
METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IPersistStream, ITaskBand)

static HRESULT STDMETHODCALLTYPE
ITaskBandImpl_GetClassID(IN OUT IPersistStream *iface,
                         OUT CLSID *pClassID)
{
    DbgPrint("ITaskBand::GetClassID(0x%p)\n", pClassID);
    /* We're going to return the (internal!) CLSID of the task band interface */
    *pClassID = CLSID_ITaskBand;
    return S_OK;
}

static HRESULT STDMETHODCALLTYPE
ITaskBandImpl_IsDirty(IN OUT IPersistStream *iface)
{
    /* The object hasn't changed since the last save! */
    return S_FALSE;
}

static HRESULT STDMETHODCALLTYPE
ITaskBandImpl_Load(IN OUT IPersistStream *iface,
                   IN IStream *pStm)
{
    DbgPrint("ITaskBand::Load called\n");
    /* Nothing to do */
    return S_OK;
}

static HRESULT STDMETHODCALLTYPE
ITaskBandImpl_Save(IN OUT IPersistStream *iface,
                   IN IStream *pStm,
                   IN BOOL fClearDirty)
{
    /* Nothing to do */
    return S_OK;
}

static HRESULT STDMETHODCALLTYPE
ITaskBandImpl_GetSizeMax(IN OUT IPersistStream *iface,
                         OUT ULARGE_INTEGER *pcbSize)
{
    DbgPrint("ITaskBand::GetSizeMax called\n");
    /* We don't need any space for the task band */
    pcbSize->QuadPart = 0;
    return S_OK;
}

static const IPersistStreamVtbl IPersistStreamImpl_Vtbl =
{
    /*** IUnknown methods ***/
    METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IPersistStream, ITaskBand),
    METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IPersistStream, ITaskBand),
    METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IPersistStream, ITaskBand),
    /*** IPersist methods ***/
    ITaskBandImpl_GetClassID,
    /*** IPersistStream methods ***/
    ITaskBandImpl_IsDirty,
    ITaskBandImpl_Load,
    ITaskBandImpl_Save,
    ITaskBandImpl_GetSizeMax
};

/*****************************************************************************/

METHOD_IUNKNOWN_INHERITED_ADDREF(IObjectWithSite, ITaskBand)
METHOD_IUNKNOWN_INHERITED_RELEASE(IObjectWithSite, ITaskBand)
METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IObjectWithSite, ITaskBand)

static HRESULT STDMETHODCALLTYPE
ITaskBandImpl_SetSite(IN OUT IObjectWithSite *iface,
                      IN IUnknown* pUnkSite)
{
    ITaskBandImpl *This = ITaskBandImpl_from_IObjectWithSite(iface);
    HRESULT hRet = E_FAIL;

    DbgPrint("ITaskBand::SetSite(0x%p)\n", pUnkSite);

    /* Release the current site */
    if (This->punkSite != NULL)
    {
        IUnknown_Release(This->punkSite);
    }

    This->punkSite = NULL;
    This->hWnd = NULL;

    if (pUnkSite != NULL)
    {
        IOleWindow *OleWindow;

        /* Check if the site supports IOleWindow */
        hRet = IUnknown_QueryInterface(pUnkSite,
                                       &IID_IOleWindow,
                                       (PVOID*)&OleWindow);
        if (SUCCEEDED(hRet))
        {
            HWND hWndParent = NULL;

            hRet = IOleWindow_GetWindow(OleWindow,
                                        &hWndParent);
            if (SUCCEEDED(hRet))
            {
                /* Attempt to create the task switch window */

                DbgPrint("CreateTaskSwitchWnd(Parent: 0x%p)\n", hWndParent);
                This->hWnd = CreateTaskSwitchWnd(hWndParent,
                                                 This->Tray);
                if (This->hWnd != NULL)
                {
                    This->punkSite = pUnkSite;
                    hRet = S_OK;
                }
                else
                {
                    DbgPrint("CreateTaskSwitchWnd() failed!\n");
                    IUnknown_Release(OleWindow);
                    hRet = E_FAIL;
                }
            }
            else
                IUnknown_Release(OleWindow);
        }
        else
            DbgPrint("Querying IOleWindow failed: 0x%x\n", hRet);
    }

    return hRet;
}

static HRESULT STDMETHODCALLTYPE
ITaskBandImpl_GetSite(IN OUT IObjectWithSite *iface,
                      IN REFIID riid,
                      OUT VOID **ppvSite)
{
    ITaskBandImpl *This = ITaskBandImpl_from_IObjectWithSite(iface);
    DbgPrint("ITaskBand::GetSite(0x%p,0x%p)\n", riid, ppvSite);

    if (This->punkSite != NULL)
    {
        return IUnknown_QueryInterface(This->punkSite,
                                       riid,
                                       ppvSite);
    }

    *ppvSite = NULL;
    return E_FAIL;
}

static const IObjectWithSiteVtbl IObjectWithSiteImpl_Vtbl =
{
    /*** IUnknown methods ***/
    METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IObjectWithSite, ITaskBand),
    METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IObjectWithSite, ITaskBand),
    METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IObjectWithSite, ITaskBand),
    /*** IObjectWithSite methods ***/
    ITaskBandImpl_SetSite,
    ITaskBandImpl_GetSite
};


/*****************************************************************************/

METHOD_IUNKNOWN_INHERITED_ADDREF(IWindowEventHandler, ITaskBand)
METHOD_IUNKNOWN_INHERITED_RELEASE(IWindowEventHandler, ITaskBand)
METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IWindowEventHandler, ITaskBand)

static HRESULT STDMETHODCALLTYPE
IWindowEventHandlerImpl_ProcessMessage(IN OUT IWindowEventHandler *iface,
                                       IN HWND hWnd,
                                       IN UINT uMsg,
                                       IN WPARAM wParam,
                                       IN LPARAM lParam,
                                       OUT LRESULT *plrResult)
{
    DbgPrint("ITaskBand: IWindowEventHandler::ProcessMessage(0x%p, 0x%x, 0x%p, 0x%p, 0x%p)\n", hWnd, uMsg, wParam, lParam, plrResult);
    return E_NOTIMPL;
}

static HRESULT STDMETHODCALLTYPE
IWindowEventHandlerImpl_ContainsWindow(IN OUT IWindowEventHandler *iface,
                                       IN HWND hWnd)
{
    ITaskBandImpl *This = ITaskBandImpl_from_IWindowEventHandler(iface);
    HRESULT hRet = S_OK;

    if (This->hWnd != hWnd ||
        !IsChild(This->hWnd,
                 hWnd))
    {
        hRet = S_FALSE;
    }

    DbgPrint("ITaskBand::ContainsWindow(0x%p) returns %s\n", hWnd, hRet == S_OK ? "S_OK" : "S_FALSE");

    return hRet;
}

static const IWindowEventHandlerVtbl IWindowEventHandlerImpl_Vtbl =
{
    /*** IUnknown methods ***/
    METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IWindowEventHandler, ITaskBand),
    METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IWindowEventHandler, ITaskBand),
    METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IWindowEventHandler, ITaskBand),
    /*** IWindowEventHandler methods ***/
    IWindowEventHandlerImpl_ProcessMessage,
    IWindowEventHandlerImpl_ContainsWindow
};

/*****************************************************************************/

static ITaskBandImpl *
ITaskBandImpl_Construct(IN OUT ITrayWindow *Tray)
{
    ITaskBandImpl *This;

    This = HeapAlloc(hProcessHeap,
                     0,
                     sizeof(*This));
    if (This == NULL)
        return NULL;

    ZeroMemory(This,
               sizeof(*This));
    This->lpVtbl = &ITaskBandImpl_Vtbl;
    This->lpDeskBandVtbl = &IDeskBandImpl_Vtbl;
    This->lpObjectWithSiteVtbl = &IObjectWithSiteImpl_Vtbl;
    This->lpDeskBarVtbl = &IDeskBarImpl_Vtbl;
    This->lpPersistStreamVtbl = &IPersistStreamImpl_Vtbl;
    This->lpWindowEventHandlerVtbl = &IWindowEventHandlerImpl_Vtbl;
    This->Ref = 1;

    This->Tray = Tray;
    This->dwBandID = (DWORD)-1;

    return This;
}

ITaskBand *
CreateTaskBand(IN OUT ITrayWindow *Tray)
{
    ITaskBandImpl *This;

    This = ITaskBandImpl_Construct(Tray);
    if (This != NULL)
    {
        return ITaskBand_from_ITaskBandImpl(This);
    }

    return NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -