<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Получение IDCompositionVisual чужого окна]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=17983&amp;type=atom" />
	<updated>2023-11-03T22:22:56Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=17983</id>
		<entry>
			<title type="html"><![CDATA[AHK: Получение IDCompositionVisual чужого окна]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=159430#p159430" />
			<content type="html"><![CDATA[<p>Недокументированное апи, которое использует виндовс для отображения DWM Thumbnails.<br /><a href="https://blog.adeltax.com/dwm-thumbnails-but-with-idcompositionvisual/">https://blog.adeltax.com/dwm-thumbnails … ionvisual/</a><br />На автохотки как-то так (при нажатии f11 будет примитивная анимация):<br /></p><div class="codebox"><pre><code>targetWindow := WinExist(&quot;ahk_class Shell_TrayWnd&quot;)

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

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

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

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

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

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

DllCall(NumGet(NumGet(EffectGroup+0)+5*A_PtrSize), &quot;ptr&quot;, EffectGroup, &quot;ptr&quot;, Scale3D)   ; IDCompositionEffectGroup::SetTransform3D
DllCall(NumGet(NumGet(windowVisual+0)+10*A_PtrSize), &quot;ptr&quot;, windowVisual, &quot;ptr&quot;, EffectGroup)   ; IDCompositionVisual::SetEffect
DllCall(NumGet(NumGet(dcompTarget+0)+3*A_PtrSize), &quot;ptr&quot;, dcompTarget, &quot;ptr&quot;, windowVisual)   ; IDCompositionTarget::SetRoot
DllCall(NumGet(NumGet(dcompDevice+0)+3*A_PtrSize), &quot;ptr&quot;, dcompDevice)   ; IDCompositionDevice::Commit
return</code></pre></div><p>Пример вертикального отображения нескольких visual (окна должны вертикально друг за другом помещаться на рабочем столе), при нажатии f1, f2, f3...&nbsp; анимация:<br /></p><div class="codebox"><pre><code>targetWindows := [WinExist(&quot;ahk_class Shell_TrayWnd&quot;), 0x1307fe, 0x3904ce]

oHotkeys := {}
loop % targetWindows.length()
{
   if !WinExist(&quot;ahk_id &quot; targetWindows[A_Index])
   {
      msgbox Window %A_Index% does not exist
      exitapp
   }
   hotkey := &quot;f&quot; A_Index
   oHotkeys[hotkey] := A_Index
   Hotkey, % hotkey, animation
}
DllCall(&quot;LoadLibrary&quot;, &quot;str&quot;, &quot;D3D11.dll&quot;)
DllCall(&quot;LoadLibrary&quot;, &quot;str&quot;, &quot;Dcomp.dll&quot;)
dwmapiLib := DllCall(&quot;LoadLibrary&quot;, &quot;str&quot;, &quot;Dwmapi.dll&quot;, &quot;ptr&quot;)
lDwmpCreateSharedThumbnailVisual := DllCall(&quot;GetProcAddress&quot;, &quot;ptr&quot;, dwmapiLib, &quot;ptr&quot;, 147, &quot;ptr&quot;)
lDwmpQueryWindowThumbnailSourceSize := DllCall(&quot;GetProcAddress&quot;, &quot;ptr&quot;, dwmapiLib, &quot;ptr&quot;, 162, &quot;ptr&quot;)
if !lDwmpCreateSharedThumbnailVisual or !lDwmpQueryWindowThumbnailSourceSize
{
   msgbox dwmapiLib error
   exitapp
}
hr := DllCall(&quot;D3D11\D3D11CreateDevice&quot;, &quot;ptr&quot;, 0, &quot;int&quot;, D3D_DRIVER_TYPE_HARDWARE := 1, &quot;ptr&quot;, 0, &quot;uint&quot;, D3D11_CREATE_DEVICE_BGRA_SUPPORT := 0x20, &quot;ptr&quot;, 0, &quot;uint&quot;, 0, &quot;uint&quot;, D3D11_SDK_VERSION := 7, &quot;ptr*&quot;, direct3dDevice, &quot;ptr*&quot;, 0, &quot;ptr*&quot;, 0)
if (hr != 0)
{
   msgbox D3D11CreateDevice error - %A_LastError%
   exitapp
}
dxgiDevice := ComObjQuery(direct3dDevice, IID_IDXGIDevice := &quot;{54ec77fa-1377-44e6-8c32-88fd5f44c84c}&quot;)
if !dxgiDevice
{
   msgbox dxgiDevice error - %A_LastError%
   exitapp
}
VarSetCapacity(IID_IDCompositionDevice, 16, 0)
DllCall(&quot;ole32\CLSIDFromString&quot;, &quot;str&quot;, &quot;{C37EA93A-E7AA-450D-B16F-9746CB0407F3}&quot;, &quot;ptr&quot;, &amp;IID_IDCompositionDevice)
hr := DllCall(&quot;Dcomp\DCompositionCreateDevice3&quot;, &quot;ptr&quot;, dxgiDevice, &quot;ptr&quot;, &amp;IID_IDCompositionDevice, &quot;ptr*&quot;, 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, &quot;uptr&quot;, targetWindows[A_Index], &quot;int&quot;, 0, &quot;ptr&quot;, &amp;windowSize%A_Index%)
   if (hr != 0)
   {
      msgbox lDwmpQueryWindowThumbnailSourceSize error - %A_LastError%
      exitapp
   }
   width%A_Index% := NumGet(windowSize%A_Index%, 0, &quot;uint&quot;)
   height%A_Index% := NumGet(windowSize%A_Index%, 4, &quot;uint&quot;)
   VarSetCapacity(DWM_THUMBNAIL_PROPERTIES%A_Index%, 48, 0)
   NumPut(0x00000010|0x00000008|0x00000001|0x00000002|0x00000004|0x4000000, DWM_THUMBNAIL_PROPERTIES%A_Index%, 0, &quot;uint&quot;)   ; 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, &quot;uint&quot;)
   NumPut(height%A_Index%, DWM_THUMBNAIL_PROPERTIES%A_Index%, 16, &quot;uint&quot;)
   NumPut(width%A_Index%, DWM_THUMBNAIL_PROPERTIES%A_Index%, 28, &quot;uint&quot;)   ; rcSource
   NumPut(height%A_Index%, DWM_THUMBNAIL_PROPERTIES%A_Index%, 32, &quot;uint&quot;) 
   NumPut(255, DWM_THUMBNAIL_PROPERTIES%A_Index%, 36, &quot;uchar&quot;)   ; opacity
   NumPut(1, DWM_THUMBNAIL_PROPERTIES%A_Index%, 37, &quot;uint&quot;)   ; fVisible
   heightAll += height%A_Index%
   if (width%A_Index% &gt; widthMax)
      widthMax := width%A_Index%
}
if (heightAll &gt; A_ScreenHeight)
{
   msgbox whole height is too long
   exitapp
}

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

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

animation:
n := oHotkeys[A_ThisHotkey]
DllCall(NumGet(NumGet(Scale3D%n%+0)+3*A_PtrSize), &quot;ptr&quot;, Scale3D%n%, &quot;ptr&quot;, Animation)   ; IDCompositionScaleTransform3D::SetScaleX(IDCompositionAnimation*)
DllCall(NumGet(NumGet(Scale3D%n%+0)+5*A_PtrSize), &quot;ptr&quot;, Scale3D%n%, &quot;ptr&quot;, Animation)   ; IDCompositionScaleTransform3D::SetScaleY(IDCompositionAnimation*)
DllCall(NumGet(NumGet(Scale3D%n%+0)+7*A_PtrSize), &quot;ptr&quot;, Scale3D%n%, &quot;ptr&quot;, Animation)   ; IDCompositionScaleTransform3D::SetScaleZ(IDCompositionAnimation*)
DllCall(NumGet(NumGet(Scale3D%n%+0)+10*A_PtrSize), &quot;ptr&quot;, Scale3D%n%, &quot;float&quot;, width%n%/2)   ; IDCompositionScaleTransform3D::SetCenterX(float)
DllCall(NumGet(NumGet(Scale3D%n%+0)+12*A_PtrSize), &quot;ptr&quot;, Scale3D%n%, &quot;float&quot;, height%n%/2)   ; IDCompositionScaleTransform3D::SetCenterY(float)
DllCall(NumGet(NumGet(EffectGroup%n%+0)+5*A_PtrSize), &quot;ptr&quot;, EffectGroup%n%, &quot;ptr&quot;, Scale3D%n%)   ; IDCompositionEffectGroup::SetTransform3D
DllCall(NumGet(NumGet(windowVisual%n%+0)+10*A_PtrSize), &quot;ptr&quot;, windowVisual%n%, &quot;ptr&quot;, EffectGroup%n%)   ; IDCompositionVisual::SetEffect
DllCall(NumGet(NumGet(dcompDevice+0)+3*A_PtrSize), &quot;ptr&quot;, dcompDevice)   ; IDCompositionDevice::Commit
return</code></pre></div><p>Вариант для отображения всех окон на рабочем столе.<br />При нажатии f11 - анимация, f12 - visual обновляются.<br /></p><div class="codebox"><pre><code>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, &quot;int&quot;)
VarSetCapacity(WINCOMPATTRDATA, A_PtrSize*3, 0)
NumPut(WCA_EXCLUDED_FROM_LIVEPREVIEW := 0xD, WINCOMPATTRDATA, 0, &quot;int&quot;)
NumPut(&amp;enable, WINCOMPATTRDATA, A_PtrSize, &quot;ptr&quot;)
NumPut(4, WINCOMPATTRDATA, A_PtrSize*2, &quot;uint&quot;)
DllCall(&quot;SetWindowCompositionAttribute&quot;, &quot;uptr&quot;, myWnd, &quot;ptr&quot;, &amp;WINCOMPATTRDATA)

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

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

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

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

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

f12::
if (OSbuildNumber &lt; 20000)
   hr := DllCall(lDwmpUpdateSharedMultiWindowVisual, &quot;uptr&quot;, hThumbVirtualDesktop, &quot;ptr&quot;, 0, &quot;uint&quot;, 0, &quot;ptr&quot;, &amp;excludeArray, &quot;uint&quot;, length, &quot;ptr&quot;, &amp;monitorSize, &quot;ptr&quot;, &amp;targetSize)
else
   hr := DllCall(lDwmpUpdateSharedMultiWindowVisual, &quot;uptr&quot;, hThumbVirtualDesktop, &quot;ptr&quot;, 0, &quot;uint&quot;, 0, &quot;ptr&quot;, &amp;excludeArray, &quot;uint&quot;, length, &quot;ptr&quot;, &amp;monitorSize, &quot;ptr&quot;, &amp;targetSize, &quot;uint&quot;, 1)
if (hr != 0)
{
   msgbox lDwmpUpdateSharedMultiWindowVisual error - %A_LastError%
   exitapp
}</code></pre></div><p><a href="http://forum.script-coding.com/viewtopic.php?pid=159431">Тема для обсуждения</a></p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2023-11-03T22:22:56Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=159430#p159430</id>
		</entry>
</feed>
