正如在@ zett42的回答中提到的,我認爲它是使用DirectComposition實現的。微軟推出桌面窗口管理器DWM,它是桌面的合成引擎。使用DWM,窗口繪製到紋理,然後在DWM中進行組合。好處是你可以獲得像3D動畫,透明等奇特效果,並且所有東西都是雙緩衝的,所以你不會得到渲染文物。
DWM最初是基於MIL(媒體集成層),我認爲這是一個場景圖API。有趣的是,當時引入的WPF也使用了MIL。這真的很酷,因爲DWM可以看到WPF窗口的場景圖,以及何時會產生效果,比如放大窗口,它會將其視爲矢量而不是位圖,因此可以在無人爲因素的情況下對其進行縮放。然而,在某些時候,微軟分叉了WPF中使用的MIL版本,並且這種集成失敗了。
快速推進幾年到Windows 8.微軟推出了新的「Metro」應用程序(後來「現代」,現在「UWP」)。引擎蓋下,這些現代應用程序使用一種新的API進行組合,DirectComposition。此API也適用於Win32應用程序,現在它由DWM自身使用。如果你看看公共的DWM函數,那麼與MIL相關的一些函數將被棄用,所以它支持我的理論,即MS從MIL轉向DC。所以,現在我們再次處於初始狀態,應用程序和DWM都使用相同的基礎架構,我們可以輕鬆添加一些有趣的效果。
在某些時候,MS已經爲DirectComposition引入了新的混合效果,由IDCompositionDevice3接口提供。其中包括高斯模糊效果,還有噪音,色調和其他效果。我發現了一種方法,在我的窗口中應用,但我不知道如何將它們應用到到我的窗口。不幸的是,我現在無法訪問我的代碼,所以我會在更新時回覆我的答案。
我根據我對文章Efficient Alpha-Blended Windows: DirectComposition的探索。基本上,你有一個對應於屏幕的「設備」和一個對應於你的窗口內容的「視覺」。你必須改變的是:
- 您的設備可以爲您創建效果。請記住
QueryInterface
它到IDCompositionDevice3
。
- 然後,您可以撥打
IDCompositionVisual3
致電SetEffect
。
但是,正如我所說,這隻適用於窗口內容。我認爲必須有一個祕密API來從DWM中獲取當前窗口的父Visual,然後在該Visual上調用SetEffect
才能獲得效果。如果某人熟練使用調試器,則應該可以通過跟蹤使用Acyllic效果的UWP應用程序來查找該API。
作爲藍色的鏡頭,我會看看GetWindowCompositionAttribute函數。它最近獲得了一些有趣的冠冕堂皇的旗幟,如WCA_VISUAL_OWNER。
來源
2017-05-31 04:16:47
jdm
[此問題](http://stackoverflow.com/q/43699256/7571258)有一些屏幕截圖,可以更好地展示噪聲影響。 – zett42