利用 SHELL 的 ITaskbarList 接口控制 TaskBar 图标

Shell 的 ITaskbarList 接口在 VC6.0 中没有定义,下面给出它的定义:

#include <objbase.h>
#include <shlobj.h>

DECLARE_INTERFACE_(ITaskbarList, IUnknown) 
{
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
    STDMETHOD_(ULONG,AddRef)(THIS)  PURE;
    STDMETHOD_(ULONG,Release)(THIS) PURE;
    STDMETHOD(HrInit)(void) PURE;
    STDMETHOD(AddTab)(HWND) PURE;
    STDMETHOD(DeleteTab)(HWND) PURE;
    STDMETHOD(ActivateTab)(HWND) PURE;
    STDMETHOD(SetActiveAlt)(HWND) PURE;
};

typedef ITaskbarList *LPTASKBARLIST;



注意和 Lv0 兄的定义有点不同,得到了定义,就可以用它控制 Taskbar 了,下面是去掉窗口的 Taskbar 图标的方法,其他以此类推:

LPTASKBARLIST pTaskbarList = NULL;

if(SUCCEEDED( ::CoInitialize(NULL) ))
{
    if(SUCCEEDED( ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, 
        IID_ITaskbarList, (void **)&pTaskbarList) ))
    {
        if(SUCCEEDED(pTaskbarList->HrInit()))
        {
            CWnd* pMainWnd = AfxGetMainWnd();
            VERIFY( SUCCEEDED( pTaskbarList->DeleteTab( pMainWnd->GetSafeHwnd() ) ) );
        }
        pTaskbarList->Release();
    }

    ::CoUninitialize();
}



注意,这段代码必须在窗口已经建立好,TaskBar 上已出现图标后调用,不然 hWnd 在 TaskBar 上还不拥有图标,DeleteTab 不起作用。

另外的去掉图标的方法还有:

使用 WS_EX_TOOLWINDOW 标志创建窗口,或者在 OnCreate 中调用 ModifyStyleEx(0, WS_EX_TOOLWINDOW);

也可以去掉图标。

你可能感兴趣的:(shell)