DWM Thumbnails. But with IDCompositionVisual.

Post your working scripts, libraries and tools for AHK v1.1 and older
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

DWM Thumbnails. But with IDCompositionVisual.

11 Nov 2023, 06:11

An undocumented api that Windows uses to display DWM Thumbnails.
https://blog.adeltax.com/dwm-thumbnails-but-with-idcompositionvisual/
On autohotkey will be something like this (when you press f11 there will be a primitive animation)::

Code: Select all

targetWindow := WinExist("ahk_class Shell_TrayWnd")

if !targetWindow
{
   msgbox targetWindow does not exist
   exitapp
}
DllCall("LoadLibrary", "str", "D3D11.dll")
DllCall("LoadLibrary", "str", "Dcomp.dll")
dwmapiLib := DllCall("LoadLibrary", "str", "Dwmapi.dll", "ptr")
lDwmpCreateSharedThumbnailVisual := DllCall("GetProcAddress", "ptr", dwmapiLib, "ptr", 147, "ptr")
lDwmpQueryWindowThumbnailSourceSize := DllCall("GetProcAddress", "ptr", dwmapiLib, "ptr", 162, "ptr")
if !lDwmpCreateSharedThumbnailVisual or !lDwmpQueryWindowThumbnailSourceSize
{
   msgbox dwmapiLib error
   exitapp
}
hr := DllCall("D3D11\D3D11CreateDevice", "ptr", 0, "int", D3D_DRIVER_TYPE_HARDWARE := 1, "ptr", 0, "uint", D3D11_CREATE_DEVICE_BGRA_SUPPORT := 0x20, "ptr", 0, "uint", 0, "uint", D3D11_SDK_VERSION := 7, "ptr*", direct3dDevice, "ptr*", 0, "ptr*", 0)
if (hr != 0)
{
   msgbox D3D11CreateDevice error - %A_LastError%
   exitapp
}
dxgiDevice := ComObjQuery(direct3dDevice, IID_IDXGIDevice := "{54ec77fa-1377-44e6-8c32-88fd5f44c84c}")
if !dxgiDevice
{
   msgbox dxgiDevice error - %A_LastError%
   exitapp
}
VarSetCapacity(IID_IDCompositionDevice, 16, 0)
DllCall("ole32\CLSIDFromString", "str", "{C37EA93A-E7AA-450D-B16F-9746CB0407F3}", "ptr", &IID_IDCompositionDevice)
hr := DllCall("Dcomp\DCompositionCreateDevice3", "ptr", dxgiDevice, "ptr", &IID_IDCompositionDevice, "ptr*", dcompDevice)
if (hr != 0)
{
   msgbox DCompositionCreateDevice3 error - %A_LastError%
   exitapp
}
ObjRelease(direct3dDevice)
ObjRelease(dxgiDevice)

VarSetCapacity(windowSize, 8, 0)
hr := DllCall(lDwmpQueryWindowThumbnailSourceSize, "uptr", targetWindow, "int", 0, "ptr", &windowSize)
if (hr != 0)
{
   msgbox lDwmpQueryWindowThumbnailSourceSize error - %A_LastError%
   exitapp
}
width := NumGet(windowSize, 0, "uint")
height := NumGet(windowSize, 4, "uint")
VarSetCapacity(DWM_THUMBNAIL_PROPERTIES, 48, 0)
NumPut(0x00000010|0x00000008|0x00000001|0x00000002|0x00000004|0x4000000, DWM_THUMBNAIL_PROPERTIES, 0, "uint")   ; DWM_TNP_SOURCECLIENTAREAONLY | DWM_TNP_VISIBLE | DWM_TNP_RECTDESTINATION | DWM_TNP_RECTSOURCE | DWM_TNP_OPACITY | DWM_TNP_ENABLE3D
NumPut(width, DWM_THUMBNAIL_PROPERTIES, 12, "uint")   ; rcDestination
NumPut(height, DWM_THUMBNAIL_PROPERTIES, 16, "uint")
NumPut(width, DWM_THUMBNAIL_PROPERTIES, 28, "uint")   ; rcSource
NumPut(height, DWM_THUMBNAIL_PROPERTIES, 32, "uint") 
NumPut(255, DWM_THUMBNAIL_PROPERTIES, 36, "uchar")   ; opacity
NumPut(1, DWM_THUMBNAIL_PROPERTIES, 37, "uint")   ; fVisible

Gui +hwndmyWnd -DPIScale
Gui Show, w%width% h%height%

hr := DllCall(lDwmpCreateSharedThumbnailVisual, "uptr", myWnd, "uptr", targetWindow, "uint", 2, "ptr", &DWM_THUMBNAIL_PROPERTIES, "ptr", dcompDevice, "ptr*", windowVisual, "ptr*", hThumbWindow)
if (hr != 0)
{
   msgbox lDwmpCreateSharedThumbnailVisual error - %A_LastError%
   exitapp
}
hr := DllCall(NumGet(NumGet(dcompDevice+0)+6*A_PtrSize), "ptr", dcompDevice, "uptr", myWnd, "int", 0, "ptr*", dcompTarget)   ; IDCompositionDevice::CreateTargetForHwnd
if (hr != 0)
{
   msgbox IDCompositionDevice::CreateTargetForHwnd error - %A_LastError%
   exitapp
}
DllCall(NumGet(NumGet(dcompDevice+0)+19*A_PtrSize), "ptr", dcompDevice, "ptr*", Scale3D)   ; IDCompositionDevice::CreateScaleTransform3D
DllCall(NumGet(NumGet(dcompDevice+0)+23*A_PtrSize), "ptr", dcompDevice, "ptr*", EffectGroup)   ; IDCompositionDevice::CreateEffectGroup
DllCall(NumGet(NumGet(dcompDevice+0)+25*A_PtrSize), "ptr", dcompDevice, "ptr*", Animation)   ; IDCompositionDevice2::CreateAnimation
DllCall(NumGet(NumGet(dcompTarget+0)+3*A_PtrSize), "ptr", dcompTarget, "ptr", windowVisual)   ; IDCompositionTarget::SetRoot
DllCall(NumGet(NumGet(dcompDevice+0)+3*A_PtrSize), "ptr", dcompDevice)   ; IDCompositionDevice::Commit
return

f11::
DllCall(NumGet(NumGet(Animation+0)+5*A_PtrSize), "ptr", Animation, "double", 0, "float", 1, "float", -1, "float", 0, "float", 0)   ; IDCompositionAnimation::AddCubic
DllCall(NumGet(NumGet(Animation+0)+5*A_PtrSize), "ptr", Animation, "double", 0.5, "float", 0.5, "float", 1, "float", 0, "float", 0)   ; IDCompositionAnimation::AddCubic
DllCall(NumGet(NumGet(Animation+0)+8*A_PtrSize), "ptr", Animation, "double", 1, "float", 1)   ; IDCompositionAnimation::End

DllCall(NumGet(NumGet(Scale3D+0)+3*A_PtrSize), "ptr", Scale3D, "ptr", Animation)   ; IDCompositionScaleTransform3D::SetScaleX(IDCompositionAnimation*)
DllCall(NumGet(NumGet(Scale3D+0)+5*A_PtrSize), "ptr", Scale3D, "ptr", Animation)   ; IDCompositionScaleTransform3D::SetScaleY(IDCompositionAnimation*)
DllCall(NumGet(NumGet(Scale3D+0)+7*A_PtrSize), "ptr", Scale3D, "ptr", Animation)   ; IDCompositionScaleTransform3D::SetScaleZ(IDCompositionAnimation*)
DllCall(NumGet(NumGet(Scale3D+0)+10*A_PtrSize), "ptr", Scale3D, "float", width/2)   ; IDCompositionScaleTransform3D::SetCenterX(float)
DllCall(NumGet(NumGet(Scale3D+0)+12*A_PtrSize), "ptr", Scale3D, "float", height/2)   ; IDCompositionScaleTransform3D::SetCenterY(float)

DllCall(NumGet(NumGet(EffectGroup+0)+5*A_PtrSize), "ptr", EffectGroup, "ptr", Scale3D)   ; IDCompositionEffectGroup::SetTransform3D
DllCall(NumGet(NumGet(windowVisual+0)+10*A_PtrSize), "ptr", windowVisual, "ptr", EffectGroup)   ; IDCompositionVisual::SetEffect
DllCall(NumGet(NumGet(dcompTarget+0)+3*A_PtrSize), "ptr", dcompTarget, "ptr", windowVisual)   ; IDCompositionTarget::SetRoot
DllCall(NumGet(NumGet(dcompDevice+0)+3*A_PtrSize), "ptr", dcompDevice)   ; IDCompositionDevice::Commit
return
An example of vertical displaying of several visuals (windows should fit vertically one after another on the desktop), when pressing f1, f2, f3... animation:

Code: Select all

targetWindows := [WinExist("ahk_class Shell_TrayWnd"), 0x1307fe, 0x3904ce]

oHotkeys := {}
loop % targetWindows.length()
{
   if !WinExist("ahk_id " targetWindows[A_Index])
   {
      msgbox Window %A_Index% does not exist
      exitapp
   }
   hotkey := "f" A_Index
   oHotkeys[hotkey] := A_Index
   Hotkey, % hotkey, animation
}
DllCall("LoadLibrary", "str", "D3D11.dll")
DllCall("LoadLibrary", "str", "Dcomp.dll")
dwmapiLib := DllCall("LoadLibrary", "str", "Dwmapi.dll", "ptr")
lDwmpCreateSharedThumbnailVisual := DllCall("GetProcAddress", "ptr", dwmapiLib, "ptr", 147, "ptr")
lDwmpQueryWindowThumbnailSourceSize := DllCall("GetProcAddress", "ptr", dwmapiLib, "ptr", 162, "ptr")
if !lDwmpCreateSharedThumbnailVisual or !lDwmpQueryWindowThumbnailSourceSize
{
   msgbox dwmapiLib error
   exitapp
}
hr := DllCall("D3D11\D3D11CreateDevice", "ptr", 0, "int", D3D_DRIVER_TYPE_HARDWARE := 1, "ptr", 0, "uint", D3D11_CREATE_DEVICE_BGRA_SUPPORT := 0x20, "ptr", 0, "uint", 0, "uint", D3D11_SDK_VERSION := 7, "ptr*", direct3dDevice, "ptr*", 0, "ptr*", 0)
if (hr != 0)
{
   msgbox D3D11CreateDevice error - %A_LastError%
   exitapp
}
dxgiDevice := ComObjQuery(direct3dDevice, IID_IDXGIDevice := "{54ec77fa-1377-44e6-8c32-88fd5f44c84c}")
if !dxgiDevice
{
   msgbox dxgiDevice error - %A_LastError%
   exitapp
}
VarSetCapacity(IID_IDCompositionDevice, 16, 0)
DllCall("ole32\CLSIDFromString", "str", "{C37EA93A-E7AA-450D-B16F-9746CB0407F3}", "ptr", &IID_IDCompositionDevice)
hr := DllCall("Dcomp\DCompositionCreateDevice3", "ptr", dxgiDevice, "ptr", &IID_IDCompositionDevice, "ptr*", dcompDevice)
if (hr != 0)
{
   msgbox DCompositionCreateDevice3 error - %A_LastError%
   exitapp
}
ObjRelease(direct3dDevice)
ObjRelease(dxgiDevice)

widthMax := heightAll := 0
loop % targetWindows.length()
{
   VarSetCapacity(windowSize%A_Index%, 8, 0)
   hr := DllCall(lDwmpQueryWindowThumbnailSourceSize, "uptr", targetWindows[A_Index], "int", 0, "ptr", &windowSize%A_Index%)
   if (hr != 0)
   {
      msgbox lDwmpQueryWindowThumbnailSourceSize error - %A_LastError%
      exitapp
   }
   width%A_Index% := NumGet(windowSize%A_Index%, 0, "uint")
   height%A_Index% := NumGet(windowSize%A_Index%, 4, "uint")
   VarSetCapacity(DWM_THUMBNAIL_PROPERTIES%A_Index%, 48, 0)
   NumPut(0x00000010|0x00000008|0x00000001|0x00000002|0x00000004|0x4000000, DWM_THUMBNAIL_PROPERTIES%A_Index%, 0, "uint")   ; DWM_TNP_SOURCECLIENTAREAONLY | DWM_TNP_VISIBLE | DWM_TNP_RECTDESTINATION | DWM_TNP_RECTSOURCE | DWM_TNP_OPACITY | DWM_TNP_ENABLE3D
   NumPut(width%A_Index%, DWM_THUMBNAIL_PROPERTIES%A_Index%, 12, "uint")
   NumPut(height%A_Index%, DWM_THUMBNAIL_PROPERTIES%A_Index%, 16, "uint")
   NumPut(width%A_Index%, DWM_THUMBNAIL_PROPERTIES%A_Index%, 28, "uint")   ; rcSource
   NumPut(height%A_Index%, DWM_THUMBNAIL_PROPERTIES%A_Index%, 32, "uint") 
   NumPut(255, DWM_THUMBNAIL_PROPERTIES%A_Index%, 36, "uchar")   ; opacity
   NumPut(1, DWM_THUMBNAIL_PROPERTIES%A_Index%, 37, "uint")   ; fVisible
   heightAll += height%A_Index%
   if (width%A_Index% > widthMax)
      widthMax := width%A_Index%
}
if (heightAll > A_ScreenHeight)
{
   msgbox whole height is too long
   exitapp
}

Gui +hwndmyWnd -DPIScale
Gui Show, w%widthMax% h%heightAll%

loop % targetWindows.length()
{
   hr := DllCall(lDwmpCreateSharedThumbnailVisual, "uptr", myWnd, "uptr", targetWindows[A_Index], "uint", 2, "ptr", &DWM_THUMBNAIL_PROPERTIES%A_Index%, "ptr", dcompDevice, "ptr*", windowVisual%A_Index%, "ptr*", hThumbWindow%A_Index%)
   if (hr != 0)
   {
      msgbox lDwmpCreateSharedThumbnailVisual error - %A_LastError%
      exitapp
   }
}
hr := DllCall(NumGet(NumGet(dcompDevice+0)+6*A_PtrSize), "ptr", dcompDevice, "uptr", myWnd, "int", 0, "ptr*", dcompTarget)   ; IDCompositionDevice::CreateTargetForHwnd
if (hr != 0)
{
   msgbox IDCompositionDevice::CreateTargetForHwnd error - %A_LastError%
   exitapp
}
DllCall(NumGet(NumGet(dcompDevice+0)+7*A_PtrSize), "ptr", dcompDevice, "ptr*", mainVisual)   ; IDCompositionDevice::CreateVisual
DllCall(NumGet(NumGet(dcompTarget+0)+3*A_PtrSize), "ptr", dcompTarget, "ptr", mainVisual)   ; IDCompositionTarget::SetRoot
heightPrev := 0
loop % targetWindows.length()
{
   DllCall(NumGet(NumGet(mainVisual+0)+16*A_PtrSize), "ptr", mainVisual, "ptr", windowVisual%A_Index%, "int", 0, "ptr", 0)   ; IDCompositionVisual::AddVisual
   DllCall(NumGet(NumGet(windowVisual%A_Index%+0)+6*A_PtrSize), "ptr", windowVisual%A_Index%, "float", heightPrev)   ; IDCompositionVisual::SetOffsetY(float)
   heightPrev += height%A_Index%
}
DllCall(NumGet(NumGet(dcompDevice+0)+3*A_PtrSize), "ptr", dcompDevice)   ; IDCompositionDevice::Commit
loop % targetWindows.length()
{
   DllCall(NumGet(NumGet(dcompDevice+0)+19*A_PtrSize), "ptr", dcompDevice, "ptr*", Scale3D%A_Index%)   ; IDCompositionDevice::CreateScaleTransform3D
   DllCall(NumGet(NumGet(dcompDevice+0)+23*A_PtrSize), "ptr", dcompDevice, "ptr*", EffectGroup%A_Index%)   ; IDCompositionDevice::CreateEffectGroup
}
DllCall(NumGet(NumGet(dcompDevice+0)+25*A_PtrSize), "ptr", dcompDevice, "ptr*", Animation)   ; IDCompositionDevice2::CreateAnimation
DllCall(NumGet(NumGet(Animation+0)+5*A_PtrSize), "ptr", Animation, "double", 0, "float", 1, "float", -1, "float", 0, "float", 0)   ; IDCompositionAnimation::AddCubic
DllCall(NumGet(NumGet(Animation+0)+5*A_PtrSize), "ptr", Animation, "double", 0.5, "float", 0.5, "float", 1, "float", 0, "float", 0)   ; IDCompositionAnimation::AddCubic
DllCall(NumGet(NumGet(Animation+0)+8*A_PtrSize), "ptr", Animation, "double", 1, "float", 1)   ; IDCompositionAnimation::End
return

animation:
n := oHotkeys[A_ThisHotkey]
DllCall(NumGet(NumGet(Scale3D%n%+0)+3*A_PtrSize), "ptr", Scale3D%n%, "ptr", Animation)   ; IDCompositionScaleTransform3D::SetScaleX(IDCompositionAnimation*)
DllCall(NumGet(NumGet(Scale3D%n%+0)+5*A_PtrSize), "ptr", Scale3D%n%, "ptr", Animation)   ; IDCompositionScaleTransform3D::SetScaleY(IDCompositionAnimation*)
DllCall(NumGet(NumGet(Scale3D%n%+0)+7*A_PtrSize), "ptr", Scale3D%n%, "ptr", Animation)   ; IDCompositionScaleTransform3D::SetScaleZ(IDCompositionAnimation*)
DllCall(NumGet(NumGet(Scale3D%n%+0)+10*A_PtrSize), "ptr", Scale3D%n%, "float", width%n%/2)   ; IDCompositionScaleTransform3D::SetCenterX(float)
DllCall(NumGet(NumGet(Scale3D%n%+0)+12*A_PtrSize), "ptr", Scale3D%n%, "float", height%n%/2)   ; IDCompositionScaleTransform3D::SetCenterY(float)
DllCall(NumGet(NumGet(EffectGroup%n%+0)+5*A_PtrSize), "ptr", EffectGroup%n%, "ptr", Scale3D%n%)   ; IDCompositionEffectGroup::SetTransform3D
DllCall(NumGet(NumGet(windowVisual%n%+0)+10*A_PtrSize), "ptr", windowVisual%n%, "ptr", EffectGroup%n%)   ; IDCompositionVisual::SetEffect
DllCall(NumGet(NumGet(dcompDevice+0)+3*A_PtrSize), "ptr", dcompDevice)   ; IDCompositionDevice::Commit
return
Example of displaying all windows on the desktop.
When you press f11 - animation, f12 - visuals are updated.

Code: Select all

width := 1000   ; gui width
height := 640   ; gui height
hwndsExclude := [0x39064a, 0x1601ca]   ; excluded windows

Gui +hwndmyWnd -DPIScale
Gui Show, w%width% h%height%
VarSetCapacity(enable, 4, 0)
NumPut(1, enable, 0, "int")
VarSetCapacity(WINCOMPATTRDATA, A_PtrSize*3, 0)
NumPut(WCA_EXCLUDED_FROM_LIVEPREVIEW := 0xD, WINCOMPATTRDATA, 0, "int")
NumPut(&enable, WINCOMPATTRDATA, A_PtrSize, "ptr")
NumPut(4, WINCOMPATTRDATA, A_PtrSize*2, "uint")
DllCall("SetWindowCompositionAttribute", "uptr", myWnd, "ptr", &WINCOMPATTRDATA)

DllCall("LoadLibrary", "str", "D3D11.dll")
DllCall("LoadLibrary", "str", "Dcomp.dll")
dwmapiLib := DllCall("LoadLibrary", "str", "Dwmapi.dll", "ptr")
lDwmpCreateSharedMultiWindowVisual := DllCall("GetProcAddress", "ptr", dwmapiLib, "ptr", 163, "ptr")
lDwmpUpdateSharedMultiWindowVisual := DllCall("GetProcAddress", "ptr", dwmapiLib, "ptr", 164, "ptr")
if !lDwmpCreateSharedMultiWindowVisual or !lDwmpUpdateSharedMultiWindowVisual
{
   msgbox dwmapiLib error
   exitapp
}
hr := DllCall("D3D11\D3D11CreateDevice", "ptr", 0, "int", D3D_DRIVER_TYPE_HARDWARE := 1, "ptr", 0, "uint", D3D11_CREATE_DEVICE_BGRA_SUPPORT := 0x20, "ptr", 0, "uint", 0, "uint", D3D11_SDK_VERSION := 7, "ptr*", direct3dDevice, "ptr*", 0, "ptr*", 0)
if (hr != 0)
{
   msgbox D3D11CreateDevice error - %A_LastError%
   exitapp
}
dxgiDevice := ComObjQuery(direct3dDevice, IID_IDXGIDevice := "{54ec77fa-1377-44e6-8c32-88fd5f44c84c}")
if !dxgiDevice
{
   msgbox dxgiDevice error - %A_LastError%
   exitapp
}
VarSetCapacity(IID_IDCompositionDevice, 16, 0)
DllCall("ole32\CLSIDFromString", "str", "{C37EA93A-E7AA-450D-B16F-9746CB0407F3}", "ptr", &IID_IDCompositionDevice)
hr := DllCall("Dcomp\DCompositionCreateDevice3", "ptr", dxgiDevice, "ptr", &IID_IDCompositionDevice, "ptr*", dcompDevice)
if (hr != 0)
{
   msgbox DCompositionCreateDevice3 error - %A_LastError%
   exitapp
}
ObjRelease(direct3dDevice)
ObjRelease(dxgiDevice)

hr := DllCall(lDwmpCreateSharedMultiWindowVisual, "uptr", myWnd, "ptr", dcompDevice, "ptr*", virtualDesktopVisual, "ptr*", hThumbVirtualDesktop)
if (hr != 0)
{
   msgbox lDwmpCreateSharedMultiWindowVisual error - %A_LastError%
   exitapp
}
VarSetCapacity(monitorSize, 16, 0)
NumPut(a_screenwidth, monitorSize, 8, "uint")
NumPut(a_screenheight, monitorSize, 12, "uint")
VarSetCapacity(targetSize, 8, 0)
NumPut(width, targetSize, 0, "uint")
NumPut(height, targetSize, 4, "uint")
length := hwndsExclude.length()
if (length = "")
   length := 0
VarSetCapacity(excludeArray, A_PtrSize*length, 0)
for k, v in hwndsExclude
   NumPut(v, excludeArray, A_PtrSize*(a_index-1), "ptr")
OSbuildNumber := StrSplit(A_OSVersion, ".")[3]
if (OSbuildNumber < 20000)
   hr := DllCall(lDwmpUpdateSharedMultiWindowVisual, "uptr", hThumbVirtualDesktop, "ptr", 0, "uint", 0, "ptr", &excludeArray, "uint", length, "ptr", &monitorSize, "ptr", &targetSize)
else
   hr := DllCall(lDwmpUpdateSharedMultiWindowVisual, "uptr", hThumbVirtualDesktop, "ptr", 0, "uint", 0, "ptr", &excludeArray, "uint", length, "ptr", &monitorSize, "ptr", &targetSize, "uint", 1)
if (hr != 0)
{
   msgbox lDwmpUpdateSharedMultiWindowVisual error - %A_LastError%
   exitapp
}
hr := DllCall(NumGet(NumGet(dcompDevice+0)+6*A_PtrSize), "ptr", dcompDevice, "uptr", myWnd, "int", 0, "ptr*", dcompTarget)   ; IDCompositionDevice::CreateTargetForHwnd
if (hr != 0)
{
   msgbox IDCompositionDevice::CreateTargetForHwnd error - %A_LastError%
   exitapp
}
DllCall(NumGet(NumGet(dcompDevice+0)+19*A_PtrSize), "ptr", dcompDevice, "ptr*", Scale3D)   ; IDCompositionDevice::CreateScaleTransform3D
DllCall(NumGet(NumGet(dcompDevice+0)+23*A_PtrSize), "ptr", dcompDevice, "ptr*", EffectGroup)   ; IDCompositionDevice::CreateEffectGroup
DllCall(NumGet(NumGet(dcompDevice+0)+25*A_PtrSize), "ptr", dcompDevice, "ptr*", Animation)   ; IDCompositionDevice2::CreateAnimation
DllCall(NumGet(NumGet(dcompTarget+0)+3*A_PtrSize), "ptr", dcompTarget, "ptr", virtualDesktopVisual)   ; IDCompositionTarget::SetRoot
DllCall(NumGet(NumGet(dcompDevice+0)+3*A_PtrSize), "ptr", dcompDevice)   ; IDCompositionDevice::Commit
return

f11::
DllCall(NumGet(NumGet(Animation+0)+5*A_PtrSize), "ptr", Animation, "double", 0, "float", 1, "float", -1, "float", 0, "float", 0)   ; IDCompositionAnimation::AddCubic
DllCall(NumGet(NumGet(Animation+0)+5*A_PtrSize), "ptr", Animation, "double", 0.5, "float", 0.5, "float", 1, "float", 0, "float", 0)   ; IDCompositionAnimation::AddCubic
DllCall(NumGet(NumGet(Animation+0)+8*A_PtrSize), "ptr", Animation, "double", 1, "float", 1)   ; IDCompositionAnimation::End

DllCall(NumGet(NumGet(Scale3D+0)+3*A_PtrSize), "ptr", Scale3D, "ptr", Animation)   ; IDCompositionScaleTransform3D::SetScaleX(IDCompositionAnimation*)
DllCall(NumGet(NumGet(Scale3D+0)+5*A_PtrSize), "ptr", Scale3D, "ptr", Animation)   ; IDCompositionScaleTransform3D::SetScaleY(IDCompositionAnimation*)
DllCall(NumGet(NumGet(Scale3D+0)+7*A_PtrSize), "ptr", Scale3D, "ptr", Animation)   ; IDCompositionScaleTransform3D::SetScaleZ(IDCompositionAnimation*)
DllCall(NumGet(NumGet(Scale3D+0)+10*A_PtrSize), "ptr", Scale3D, "float", width/2)   ; IDCompositionScaleTransform3D::SetCenterX(float)
DllCall(NumGet(NumGet(Scale3D+0)+12*A_PtrSize), "ptr", Scale3D, "float", height/2)   ; IDCompositionScaleTransform3D::SetCenterY(float)

DllCall(NumGet(NumGet(EffectGroup+0)+5*A_PtrSize), "ptr", EffectGroup, "ptr", Scale3D)   ; IDCompositionEffectGroup::SetTransform3D
DllCall(NumGet(NumGet(virtualDesktopVisual+0)+10*A_PtrSize), "ptr", virtualDesktopVisual, "ptr", EffectGroup)   ; IDCompositionVisual::SetEffect
DllCall(NumGet(NumGet(dcompTarget+0)+3*A_PtrSize), "ptr", dcompTarget, "ptr", virtualDesktopVisual)   ; IDCompositionTarget::SetRoot
DllCall(NumGet(NumGet(dcompDevice+0)+3*A_PtrSize), "ptr", dcompDevice)   ; IDCompositionDevice::Commit
return

f12::
if (OSbuildNumber < 20000)
   hr := DllCall(lDwmpUpdateSharedMultiWindowVisual, "uptr", hThumbVirtualDesktop, "ptr", 0, "uint", 0, "ptr", &excludeArray, "uint", length, "ptr", &monitorSize, "ptr", &targetSize)
else
   hr := DllCall(lDwmpUpdateSharedMultiWindowVisual, "uptr", hThumbVirtualDesktop, "ptr", 0, "uint", 0, "ptr", &excludeArray, "uint", length, "ptr", &monitorSize, "ptr", &targetSize, "uint", 1)
if (hr != 0)
{
   msgbox lDwmpUpdateSharedMultiWindowVisual error - %A_LastError%
   exitapp
}
Presentation of DirectComposition:
https://www.youtube.com/watch?v=rK8kNe0mVMU
elad770
Posts: 82
Joined: 30 Oct 2020, 16:21

Re: DWM Thumbnails. But with IDCompositionVisual.

20 Dec 2023, 04:39

Can you please contact me? Check your inbox

Return to “Scripts and Functions (v1)”

Who is online

Users browsing this forum: No registered users and 46 guests