Posted on 2008-12-08 08:50
S.l.e!ep.¢% 閱讀(293)
評論(0) 編輯 收藏 引用 所屬分類:
VC
? 最近開發(fā)的一個(gè)軟件的功能模塊, 需要使用桌面作為舞臺, 在上面繪制一些東西, 輸出一些文字, 作為研究這個(gè)課題的副產(chǎn)品. 我寫了一個(gè)簡陋的"媒體播放器", 就使用到了這個(gè)技術(shù).
?? 如果 shell (也就是資源管理器) 正在運(yùn)行, 則桌面的頂層窗口是 "Progman" 類的窗口, 其擁有的子窗口是 "SHELLDLL_DefView" 類的窗口, 再下一級的子窗口是一個(gè)標(biāo)準(zhǔn)的 ListView. 如果資源管理器沒有運(yùn)行, 則頂層窗口是由 GetTopWindow() 函數(shù)返回的窗口, 它屬于 csrss.exe 進(jìn)程. 我們這里只討論資源管理器運(yùn)行時(shí)的情景, 因?yàn)?GetTopWindow 窗口只有唯一窗口, 操作簡單; 而 shell 桌面窗口有三層, 而且我們還要在桌面圖標(biāo)之后操作.
?? 大致的細(xì)節(jié)是, (1). 設(shè)置播放窗口的擁有者窗口是 "SHELLDLL_DefView" 類的窗口; (2). 設(shè)置桌面壁紙為顏色值為 RGB < 16, 0, 16 > 的純色壁紙, 這個(gè)顏色是 DX 視頻設(shè)置的 Key Color 色, 不是隨隨便便指定的; (3) 重新設(shè)置桌面的 ListView 的父窗口是 "SHELLDLL_DefView" 類的窗口, (這看起來有點(diǎn)脫褲子放屁, 但在這里卻是必要的), 這將重新排列幾個(gè)桌面窗口的顯示順序.
?? 到此為止, 原理就差不多了. 最后還有個(gè)問題, 就是當(dāng)有人在播放期間, 重新設(shè)置了壁紙, 就必須要響應(yīng) WM_SETTINGCHANGE 消息等, 將前述的流程再走一遍, 否則正在播放的視頻將消失.
?? 下面是
源代碼和可執(zhí)行二進(jìn)制文件參考資料:
?? (1). 某網(wǎng)站的某哥們的一個(gè)簡易播放器, 用 VB6 開發(fā), 我的東東就是基于它的.
?? (2). http://www.videolan.org/vlc/?? 一個(gè)開源的媒體播放器.