Надо типа так:
loop
{
hr := IDXGIFactory_EnumAdapters(IDXGIFactory, A_Index-1, IDXGIAdapter)
if (hr = "DXGI_ERROR_NOT_FOUND")
break
loop
{
hr := IDXGIAdapter_EnumOutputs(IDXGIAdapter, A_Index-1, IDXGIOutput)
if (hr = "DXGI_ERROR_NOT_FOUND")
break
VarSetCapacity(DXGI_OUTPUT_DESC, 88+A_PtrSize, 0)
IDXGIOutput_GetDesc(IDXGIOutput, &DXGI_OUTPUT_DESC)
AttachedToDesktop := NumGet(DXGI_OUTPUT_DESC, 80, "int")
if (AttachedToDesktop = 1)
{
width := NumGet(DXGI_OUTPUT_DESC, 72, "int") - NumGet(DXGI_OUTPUT_DESC, 64, "int")
height := NumGet(DXGI_OUTPUT_DESC, 76, "int") - NumGet(DXGI_OUTPUT_DESC, 68, "int")
list .= IDXGIAdapter "," IDXGIOutput "," width "," height "`n"
}
}
}
msgbox % list
IDXGIFactory_EnumAdapters(this, Adapter, ByRef ppAdapter)
{
hr := DllCall(NumGet(NumGet(this+0)+7*A_PtrSize), "ptr", this, "uint", Adapter, "ptr*", ppAdapter)
if hr or ErrorLevel
{
if !ErrorLevel
{
if (hr&=0xFFFFFFFF) = 0x887A0002 ; DXGI_ERROR_NOT_FOUND
return "DXGI_ERROR_NOT_FOUND"
}
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
}
IDXGIAdapter_EnumOutputs(this, Output, ByRef ppOutput)
{
hr := DllCall(NumGet(NumGet(this+0)+7*A_PtrSize), "ptr", this, "uint", Output, "ptr*", ppOutput)
if hr or ErrorLevel
{
if !ErrorLevel
{
if (hr&=0xFFFFFFFF) = 0x887A0002 ; DXGI_ERROR_NOT_FOUND
return "DXGI_ERROR_NOT_FOUND"
}
_Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
}
}
Только не нужно забывать вызывать ObjRelease для неиспользуемых IDXGIAdapter и IDXGIOutput.
Я их в коде забыл прописать. Сейчас прописал.