求大侠帮帮忙,如何注册deskband后立即显示出来

sina881027 2014-06-04 04:03:41
小弟根据windows sdk的例子做了一个deskband 是任务栏的那种,现在需要注册后立即显示出来,需要怎么做,求大侠帮帮忙
...全文
287 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
juujujujuju 2016-07-14
  • 打赏
  • 举报
回复
请问一下这个在XP上显示的问题是怎么解决的啊?
sina881027 2014-06-06
  • 打赏
  • 举报
回复
问题解决了,忘记初始化。 现在能显示了
zapline 2014-06-05
  • 打赏
  • 举报
回复
当时我做这个也挺烦的,搞了好多方案。 上面的代码能显示出来,但是会弹出一个是否添加deskband的询问框。 我对付这个框的方法是模拟点击确定按钮,即找到特定的对话框,发送特定的点击事件。 模拟点击我搞了两个方案: 1,在执行完显示后的几秒钟,去枚举所有窗口 2,做一个cbt钩子(还有32位和64位区分),针对explorer的所有对话框,在create事件里hook来判断(在执行显示前set通知事件来是hook生效) 另外,隐藏还会有一些小麻烦,我也搞了一些方法来处理,你自己好好玩玩吧
zapline 2014-06-05
  • 打赏
  • 举报
回复
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);
}
sina881027 2014-06-05
  • 打赏
  • 举报
回复
我试了一下,还是没有显示出来,这段代码改如何使用呢, 我把这些代码放在DllMain里面,弄成输出函数,外面程序调用ShowDeskband不显示,是不是我使用的方法不对,求指教
sina881027 2014-06-05
  • 打赏
  • 举报
回复
谢谢楼上大侠,CLSID_SampleDeskBand 这个参数是什么意思
sina881027 2014-06-04
  • 打赏
  • 举报
回复
自己给自己顶一下,求大神来解决

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧