S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

用桌面作为播放窗口的简陋媒体播放器

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

参考资料:
   (1). 某网站的某哥们的一个简易播放器, 用 VB6 开发, 我的东东就是基于它的.
   (2). http://www.videolan.org/vlc/   一个开源的媒体播放器.

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