调试桌面工具栏(桌面Band)时的一两个小技巧

记得有一次,突然在一个同事的机器上看到Windows Media Player放在了桌面任务栏上,眼前顿时一亮,曾决定自己要弄一个,不过当时公司有任务,过一段时间也就忘了。
这几天,公司要搞一个小东西,突然想到了也许可以放在桌面任务栏(应该是工具栏吧)上,就开始着手编了起来。
查了几个资料,发现也就实现几个接口而已,IDeskBand,IOleWithObject,IPersitStream,简单的很。真正编的还是我自己的功能。

不过公司任务没完成,没时间详细写这个了,但是又怕自己忘记,就只写上几个编我这个程序时摸到的技巧。

正如资料上所述的,编桌面工具栏时有一个很讨厌的是每次在桌面上装上这个桌面栏,然后卸掉后,Windows并不会也跟着及时卸掉我的Dll(感觉资料上说是一直无法卸掉,但我的系统上是过一段时间后会卸掉,不知道是不是版本问题)。这样我就无法继续编译了,只得重新启动,后来我是用先注销,再重新登录XP的方法,但还是麻烦。
当时就有一种想法,是否可以让我的程序故意出错,让系统自己重新启动Explorer呢,在一次意外中,终于让我找到了正确的出错点。这个错,不会影响我正常的调试,但是又能让我重新启动Explorer。

在实现IDeskBand(实际是IDockingWindow)的CloseDW方法(也就是卸掉工具栏时,这个时机应该是比较好的吧,不过要调试拖出任务栏这种功能时,就不妥了)时,不隐藏工具栏窗口的话,就会出错重新启动Explorer了。

下面是示例代码:
STDMETHODIMP CWaveBar::CloseDW(DWORD dwReserved)
{
//    m_waveui.ShowWindow(SW_HIDE);
  
    if(m_waveui.IsWindow())
        m_waveui.DestroyWindow();
      
    return S_OK;
}
m_waveui就是工具栏主窗口了,GetWindow方法要求的HWND就是它的。

/*************************************************************************
注:另人意外的是,不知怎么改了什么地方的代码后,程序又不会出错了,不过没关系,加一句
ATLASSERT(FALSE);就OK(继续出错:))了

STDMETHODIMP CWaveBar::CloseDW(DWORD dwReserved)
{
    m_waveui.ShowWindow(SW_HIDE);
  
    if(m_waveui.IsWindow())
        m_waveui.DestroyWindow();
    ATLASSERT(FALSE);
    return S_OK;
}
*************************************************************************/

另外用SPY++看的话,你可以发现其实XP桌面也都是一个个窗口组成了,在下面的任务栏中,快速应用程序栏,应用程序任务栏,(有可能有你的工具栏),(一般情况会有输入法栏),这几个窗口就都在一个Rebar窗口的某个Band里了,而这个Rebar窗口又是整个任务栏的子窗口。有兴趣的,可以看看,挺有意思的
这里要说的是,因为工具栏的父窗口实际是一个Rebar窗口,所以事实上就可以通过给Rebar窗口发送消息来控制系统任务栏了,这里我发送了一个RB_SHOWBAND来隐藏我自己的工具栏,代码如下:

        if(::IsWindow(m_hwndParent)){
            SendMessage(m_hwndParent, RB_SHOWBAND, (WPARAM)m_dwBandID, (LPARAM)0);
        }

就先写这儿了,这里推荐杨教师的文章作为参考资料,通俗易懂,其实用IDeskBand之类的关键词搜索,可以搜索到很多的,msdn上也有。

http://www.vckbase.com/document/viewdoc/?id=1457


今天又发现一个DeskBand的秘密。
其实一开始就想实现输入法栏一样的可以真正的在程序中控制是否停靠到任务栏的功能的,本以为肯定很简单的,没想到,就是找不到这方面的资料,只好自己摸了,后来就实现了象Windows Media Player类似的假的停靠和浮动了(因为实际上还是靠着的,当你最大化时,你可以在右键菜单工具栏项上看到它是还是打着勾勾的)。

因为有勾勾这种东西存在,而且似乎系统启动的话就是带着以前的状态的(也就是说关机前是勾上的,开机时还是勾上的),所以就想当然的认为这个勾勾和注册表有关,所以就一直查这方面的东西了,用Regmon看了半天,不得其果,因为并不是实时保存的,只有在关闭Explorer时,才将这些状态保存到注册表中,真的是不好查啊。

后来看到了Google桌面搜索,这个东东里面有个关闭菜单,而且关闭居然是真关闭,如获至宝,马上查,发现真的和注册表无关。郁闷。

大概老天可怜,一不小心,居然让我想到了我的这个Blog,又一不小心让我看到了RB_SHOWBAND,晕,不会工具栏的这个勾勾是和是否靠到Rebar上有关的,马上试验。

调用
                SendMessage(m_hwndParent, RB_DELETEBAND, (WPARAM)m_dwBandID, (LPARAM)0);
老天,真的是这样,勾勾不见了。
原来就是这么回事啊!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值