随笔-60  评论-262  文章-1  trackbacks-0
   最近开发的一个软件的功能模块, 需要使用桌面作为舞台, 在上面绘制一些东西, 输出一些文字, 作为研究这个课题的副产品. 我写了一个简陋的"媒体播放器", 就使用到了这个技术.

   如果 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 阅读(1983) 评论(6)  编辑 收藏 引用

评论:
# re: 用桌面作为播放窗口的简陋媒体播放器 2008-12-07 22:31 | 沈臻豪(foxtail)
好厉害哦  回复  更多评论
  
# re: 用桌面作为播放窗口的简陋媒体播放器 2008-12-08 09:22 | foxtail
how shability o...
  回复  更多评论
  
# re: 用桌面作为播放窗口的简陋媒体播放器 2008-12-08 09:44 | Xin
有没有办法做成像超级解霸播放器的那个背景播放的功能一样呢?  回复  更多评论
  
# re: 用桌面作为播放窗口的简陋媒体播放器 2008-12-08 09:59 | free2000fly
@Xin
就是学那个超级结巴的效颦物  回复  更多评论
  
# re: 用桌面作为播放窗口的简陋媒体播放器 2008-12-13 18:03 | dell笔记本
厉害呀  回复  更多评论
  
# re: 用桌面作为播放窗口的简陋媒体播放器 2008-12-14 21:03 | patz
挺有意思的,可以當動態壁紙了。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理