最近开发的一个软件的功能模块, 需要使用桌面作为舞台, 在上面绘制一些东西, 输出一些文字, 作为研究这个课题的副产品. 我写了一个简陋的"媒体播放器", 就使用到了这个技术.
如果 shell (也就是资源管理器) 正在运行, 则桌面的顶层窗口是 "Progman" 类的窗口, 其拥有的子窗口是 "SHELLDLL_DefView" 类的窗口, 再下一级的子窗口是一个标准的 ListView. 如果资源管理器没有运行, 则顶层窗口是由 GetTopWindow() 函数返回的窗口, 它属于 csrss.exe 进程. 我们这里只讨论资源管理器运行时的情景, 因为 GetTopWindow 窗口只有唯一窗口, 操作简单; 而 shell 桌面窗口有三层, 而且我们还要在桌面图标之后操作.
大致的细节是, (1). 设置播放窗口的拥有者窗口是 "SHELLDLL_DefView" 类的窗口; (2). 设置桌面壁纸为颜色值为 RGB < 16, 0, 16 > 的纯色壁纸, 这个颜色是 DX 视频设置的 Color Key 色, 不是随随便便指定的; (3) 重新设置桌面的 ListView 的父窗口是 "SHELLDLL_DefView" 类的窗口, (这看起来有点脱裤子放屁, 但在这里却是必要的), 这将重新排列几个桌面窗口的 Z-order 和显示顺序.
到此为止, 原理就差不多了. 最后还有个问题, 就是当有人在播放期间, 重新设置了壁纸, 就必须要响应 WM_SETTINGCHANGE 消息等, 将前述的流程再走一遍, 否则正在播放的视频将消失.
这里是
源代码和可执行二进制文件PS: 近来研究 directdraw 的 overlay 技术, 发现 color key 的颜色值可以随便指定. 上述 RGB < 16, 0, 16 > 颜色值是微软的媒体播放器的采用值. 2009.1.10.
参考资料:
(1). 某网站的某哥们的一个简易播放器, 用 VB6 开发, 我的东东就是基于它的.
(2). http://www.videolan.org/vlc/ 一个开源的媒体播放器.
posted on 2008-12-07 21:04
free2000fly 阅读(2004)
评论(6) 编辑 收藏 引用