bool ShowDeskband()
{
    CComPtr<ITrayDeskBand> spTrayDeskBand;
    HRESULT hr = spTrayDeskBand.CoCreateInstance(CLSID_TrayDeskBand);    if(SUCCEEDED(hr))   // Vista and higher
    {
        hr = spTrayDeskBand->DeskBandRegistrationChanged();
        ATLASSERT(SUCCEEDED(hr));        if(SUCCEEDED(hr))
        {
            int i = 5;
            do 
            {
                hr = spTrayDeskBand->IsDeskBandShown(CLSID_KWifiDeskBand);
                if(SUCCEEDED(hr))
                {
                    if (hr == S_FALSE)
                    {
                        hr = spTrayDeskBand->ShowDeskBand(CLSID_KWifiDeskBand);
                    }
                    break;
                }
            } while (i-- > 0);
            ATLASSERT(SUCCEEDED(hr));            
        }
    }
    else    // WinXP workaround
    {
        WCHAR *pBuf = new WCHAR[49];       //很配存储文字串的空间
        ::StringFromGUID2(CLSID_KWifiDeskBand, pBuf, 49);
        if(!::GlobalFindAtom(pBuf))
            ::GlobalAddAtom(pBuf);        // Beware! SHLoadInProc is not implemented under Vista and higher.
        hr = ::SHLoadInProc(CLSID_KWifiDeskBand);
        ATLASSERT(SUCCEEDED(hr));
    }    return SUCCEEDED(hr);
}bool HideDeskband()
{
    CComPtr<ITrayDeskBand> spTrayDeskBand;
    HRESULT hr = spTrayDeskBand.CoCreateInstance(CLSID_TrayDeskBand);    if(SUCCEEDED(hr))   // Vista and higher
    {
        hr = spTrayDeskBand->IsDeskBandShown(CLSID_KWifiDeskBand);        if(hr == S_OK)
            hr = spTrayDeskBand->HideDeskBand(CLSID_KWifiDeskBand);
    }
    else    // WinXP
    {
        CComPtr<IBandSite> spBandSite;
        hr = spBandSite.CoCreateInstance(CLSID_TrayBandSiteService);        if(SUCCEEDED(hr))
        {
            DWORD dwBandID = 0;
            const UINT nBandCount = spBandSite->EnumBands((UINT)-1, &dwBandID);            for(UINT i = 0; i < nBandCount; ++i)
            {
                spBandSite->EnumBands(i, &dwBandID);                CComPtr<IPersist> spPersist;
                hr = spBandSite->GetBandObject(dwBandID, IID_IPersist, 
                    (void**)&spPersist);                if(SUCCEEDED(hr))
                {
                    CLSID clsid = CLSID_NULL;
                    hr = spPersist->GetClassID(&clsid);                    if(SUCCEEDED(hr) && ::IsEqualCLSID(clsid, CLSID_KWifiDeskBand))
                    {
                        hr = spBandSite->RemoveBand(dwBandID);
                        break;
                    }
                }
            }
        }
    }    return SUCCEEDED(hr);
}

解决方案 »

  1.   

    当时我做这个也挺烦的,搞了好多方案。上面的代码能显示出来,但是会弹出一个是否添加deskband的询问框。我对付这个框的方法是模拟点击确定按钮,即找到特定的对话框,发送特定的点击事件。
    模拟点击我搞了两个方案:
    1,在执行完显示后的几秒钟,去枚举所有窗口
    2,做一个cbt钩子(还有32位和64位区分),针对explorer的所有对话框,在create事件里hook来判断(在执行显示前set通知事件来是hook生效)另外,隐藏还会有一些小麻烦,我也搞了一些方法来处理,你自己好好玩玩吧
      

  2.   

    谢谢楼上大侠,CLSID_SampleDeskBand 这个参数是什么意思
      

  3.   

    我试了一下,还是没有显示出来,这段代码改如何使用呢, 我把这些代码放在DllMain里面,弄成输出函数,外面程序调用ShowDeskband不显示,是不是我使用的方法不对,求指教