Win32 API 日本語リファレンス
ホームDevices.Display › SetDisplayConfig

SetDisplayConfig

関数
ディスプレイのパスとモードの構成を設定する。
DLLUSER32.dll呼出規約winapi対応OSWindows 7 以降

シグネチャ

// USER32.dll
#include <windows.h>

INT SetDisplayConfig(
    DWORD numPathArrayElements,
    DISPLAYCONFIG_PATH_INFO* pathArray,   // optional
    DWORD numModeInfoArrayElements,
    DISPLAYCONFIG_MODE_INFO* modeInfoArray,   // optional
    SET_DISPLAY_CONFIG_FLAGS flags
);

パラメーター

名前方向説明
numPathArrayElementsDWORDinpathArray 内の要素数。
pathArrayDISPLAYCONFIG_PATH_INFO*inoptional設定対象となるすべてのディスプレイパスの配列です。この配列内のパスのうち、DISPLAYCONFIG_PATH_INFOflags メンバーに DISPLAYCONFIG_PATH_ACTIVE フラグが設定されているパスのみが設定されます。このパラメーターは NULL にできます。この配列内でアクティブなパスが並ぶ順序によってパスの優先順位が決まります。パスの優先順位の詳細については、Path Priority Order を参照してください。
numModeInfoArrayElementsDWORDinmodeInfoArray 内の要素数。
modeInfoArrayDISPLAYCONFIG_MODE_INFO*inoptionalディスプレイのソースおよびターゲットのモード情報(DISPLAYCONFIG_MODE_INFO)の配列で、pathArray のパス情報内の DISPLAYCONFIG_PATH_SOURCE_INFO および DISPLAYCONFIG_PATH_TARGET_INFO 要素の modeInfoIdx メンバーによって参照されます。このパラメーターは NULL にできます。
flagsSET_DISPLAY_CONFIG_FLAGSin

この関数の動作を示すフラグ値のビット単位の OR です。このパラメーターには、次の値のいずれか、または複数の値の組み合わせを指定できます。0 は無効です。有効なフラグの組み合わせについては、以下の説明を参照してください。

意味
SDC_APPLY
0x00000080
結果として得られるトポロジ、ソース、およびターゲットのモードを設定します。
SDC_NO_OPTIMIZATION
0x00000100
SDC_APPLY フラグに対する修飾子です。これにより、各アクティブなディスプレイについて、モード変更がドライバーまで強制的に適用されます。
SDC_USE_SUPPLIED_DISPLAY_CONFIG
0x00000020
データベースから構成を検索する代わりに、pathArray および modeInfoArray パラメーターで指定されたトポロジ、ソース、およびターゲットのモード情報を使用します。
SDC_SAVE_TO_DATABASE
0x00000200
結果として得られるトポロジ、ソース、およびターゲットのモードをデータベースに保存します。
SDC_VALIDATE
0x00000040
要求されたトポロジ、ソース、およびターゲットのモード情報を設定可能かどうかを、システムが検証します。
SDC_ALLOW_CHANGES
0x00000400
必要に応じて、機能するディスプレイパスのセットを作成するために、関数が指定されたソースおよびターゲットのモード情報を変更できます。
SDC_TOPOLOGY_CLONE
0x00000002
呼び出し元は、永続化データベースから最後のクローン構成を要求します。
SDC_TOPOLOGY_EXTEND
0x00000004
呼び出し元は、永続化データベースから最後の拡張構成を要求します。
SDC_TOPOLOGY_INTERNAL
0x00000001
呼び出し元は、永続化データベースから最後の内部構成を要求します。
SDC_TOPOLOGY_EXTERNAL
0x00000008
呼び出し元は、永続化データベースから最後の外部構成を要求します。
SDC_TOPOLOGY_SUPPLIED
0x00000010
呼び出し元がパスデータを提供するため、関数は永続化データベースを照会してソースおよびターゲットのモードを見つけて使用するだけになります。
SDC_USE_DATABASE_CURRENT
(SDC_TOPOLOGY_INTERNAL | SDC_TOPOLOGY_CLONE | SDC_TOPOLOGY_EXTEND | SDC_TOPOLOGY_EXTERNAL)
呼び出し元は、4 つの SDC_TOPOLOGY_XXX 構成すべての組み合わせを要求します。この値は、現在接続されているモニターに対して、最後にわかっているディスプレイ構成を設定するよう API に指示します。
SDC_PATH_PERSIST_IF_REQUIRED
0x00000800
関数が SDC_TOPOLOGY_XXX 要求を処理する際、必要であれば、要求を満たすためにターゲットへのパスの永続化を強制できます。このフラグと組み合わせ可能なその他のフラグについては、後述の一覧を参照してください。
SDC_FORCE_MODE_ENUMERATION
0x00001000
SetDisplayConfig が新しいディスプレイ構成を設定する間に、ドライバーが GDI モード一覧を更新する機会を与えるよう、呼び出し元が要求します。このフラグ値は、SDC_USE_SUPPLIED_DISPLAY_CONFIG および SDC_APPLY のフラグ値も併せて指定されている場合にのみ有効です。
SDC_ALLOW_PATH_ORDER_CHANGES
0x00002000
SDC_TOPOLOGY_SUPPLIED フラグに対する修飾子で、データベースを検索する際に、SetDisplayConfig が指定されたトポロジのパス順序を無視すべきであることを示します。このフラグが設定されている場合、パス順序に関係なくすべてのパスを含む最新のトポロジが設定されます。
SDC_VIRTUAL_MODE_AWARE
0x00008000
SDC_USE_SUPPLIED_DISPLAY_CONFIG および SDC_TOPOLOGY_SUPPLIED フラグに対する修飾子で、呼び出し元が仮想モードを認識していることを示します。 Windows 10 以降でサポートされます。
SDC_VIRTUAL_REFRESH_RATE_AWARE
0x00020000
SDC_USE_SUPPLIED_DISPLAY_CONFIG および SDC_TOPOLOGY_SUPPLIED フラグに対する修飾子で、呼び出し元が仮想リフレッシュレートを認識していることを示します。 Windows 11 以降でサポートされます。

次の一覧は、Flags パラメーターに対する値の有効な組み合わせを示しています。

SDC_TOPOLOGY_XXX フラグは組み合わせて使用できます。たとえば、SDC_TOPOLOGY_CLONESDC_TOPOLOGY_EXTEND が設定されている場合、API は最新のクローンまたは拡張トポロジ、すなわち現在接続されているモニターに対して最も新しく設定されたいずれかのトポロジを使用します。

戻り値の型: INT

公式ドキュメント

SetDisplayConfig 関数は、現在のセッションで指定されたパスを排他的に有効化することにより、ディスプレイのトポロジ、ソース、およびターゲットのモードを変更します。

戻り値

この関数は、次のいずれかの戻り値を返します。

戻り値 説明
ERROR_SUCCESS
関数が成功しました。
ERROR_INVALID_PARAMETER
指定されたパラメーターとフラグの組み合わせが無効です。
ERROR_NOT_SUPPORTED
システムが Windows Display Driver Model (WDDM) に従って記述されたグラフィックスドライバーを実行していません。この関数は、WDDM ドライバーが動作しているシステムでのみサポートされます。
ERROR_ACCESS_DENIED
呼び出し元がコンソールセッションにアクセスできません。このエラーは、呼び出しプロセスが現在のデスクトップにアクセスできない場合、またはリモートセッションで実行されている場合に発生します。
ERROR_GEN_FAILURE
原因不明のエラーが発生しました。
ERROR_BAD_CONFIGURATION
呼び出し元が指定しなかったソースおよびターゲットのモードについて、関数が実行可能な解を見つけられませんでした。

解説(Remarks)

SetDisplayConfig 関数は、指定されたソースおよびターゲットのモード情報を含むアクティブなディスプレイパスを受け取り、最適モードロジックを使用して、不足しているソースおよびターゲットのモード情報を生成します。その後、この関数は完全なディスプレイパスを設定します。

DISPLAYCONFIG_PATH_SOURCE_INFO および DISPLAYCONFIG_PATH_TARGET_INFO 構造体の ModeInfoIdx メンバーは、特定のアクティブなパスに対してソースおよびターゲットのモードが指定されているかどうかを示すために使用されます。いずれかのインデックス値が DISPLAYCONFIG_PATH_MODE_IDX_INVALID である場合、そのモード情報が指定されていないことを示します。特定のパスについて、パスとソースモード、またはパスとソースおよびターゲットのモード情報を指定することは有効です。ただし、ソースモードを指定せずにパスとターゲットモードを指定することは無効です。

各ソースおよびターゲットの識別子に対するソースおよびターゲットのモードは、modeInfoArray 配列に一度だけ現れます。たとえば、ソース識別子 S1 のソースモードはテーブルに一度だけ現れます。複数のパスが同じソースを参照する場合、それらは同じ ModeInfoIdx を使用する必要があります。

ほとんどの呼び出し元は、QueryDisplayConfig を使用して現在の構成とその他の有効な候補を取得し、その後 SetDisplayConfig を使用して構成のテストと設定を行うことが想定されています。

PathArray 配列内でアクティブなパスが並ぶ順序によって、パスの優先順位が決まります。

既定では、SetDisplayConfig は、指定されたパス、ソースモード、またはターゲットモードの情報を一切変更しません。最適モードロジックが、指定されたディスプレイパス情報を変更せずに解を見つけられない場合、SetDisplayConfigERROR_BAD_CONFIGURATION で失敗します。この場合、呼び出し元は SDC_ALLOW_CHANGES フラグを指定して、関数が指定されたソースおよびモードの詳細の一部を調整し、ディスプレイパスの変更を成功させられるようにする必要があります。

指定された、または計算されたソースおよびターゲットのモードが同じ寸法を持つ場合、SetDisplayConfig は、ディスプレイパスを設定してデータベースに保存する前に、パスのスケーリングを自動的に DISPLAYCONFIG_PPR_IDENTITY に設定します。SetDisplayConfig がスケーリングをどのように処理するかについては、Scaling the Desktop Image を参照してください。

呼び出し元が SDC_USE_SUPPLIED_DISPLAY_CONFIG フラグを指定してクローンパスを設定する場合に、パス配列内のいずれかのソースモードインデックスが無効であれば、SetDisplayConfig はそのソースからのソースモードインデックスがすべて無効であると判断します。SetDisplayConfig は最適モードロジックを使用してソースモード情報を決定します。

SDC_TOPOLOGY_SUPPLIED フラグ(SDC_TOPOLOGY_SUPPLIED の詳細については後続の段落を参照)を除き、SDC_TOPOLOGY_XXX フラグは、そのトポロジ種別のソースおよびターゲットのモード情報を含む、最後のディスプレイパス設定を設定します。有効な SDC_TOPOLOGY_XXX フラグの組み合わせについては、Flags パラメーターの説明を参照してください。pathArray および modeInfoArray パラメーターは NULL でなければならず、それらに関連付けられたサイズはゼロでなければなりません。たとえば、SDC_TOPOLOGY_CLONESDC_TOPOLOGY_EXTEND が設定されている場合、この関数は最新のクローンまたは拡張のディスプレイパス構成を使用します。単一のトポロジ種別が要求された場合は、その種別の最後の構成が使用されます。そのトポロジが以前に一度も設定されたことがない場合、SetDisplayConfig は最適トポロジロジックを使用して最適なトポロジを見つけ、続いて最適モードロジックを使用して使用する最適なソースおよびターゲットのモードを見つけます。トポロジフラグの組み合わせが設定されていて、そのいずれにもデータベースのエントリがなかった場合は、次の優先順位が使用されます。ラップトップの場合は、クローン、拡張、内部、続いて外部の順です。デスクトップの場合の優先順位は、拡張、続いてクローンの順です。

呼び出し元は SDC_TOPOLOGY_SUPPLIED フラグを指定して、パス情報(トポロジ)のみを設定し、SetDisplayConfig が永続化データベースからソースおよびターゲットのモード情報を取得して使用するよう要求できます。呼び出し元が指定したアクティブなパスが永続化データベースにエントリを持たない場合、SetDisplayConfig は失敗します。この場合、呼び出し元が同じパスデータで、ただし SDC_USE_SUPPLIED_DISPLAY_CONFIG フラグを設定して再び SetDisplayConfig を呼び出すと、SetDisplayConfig は最適モードロジックを使用してソースおよびターゲットのモード情報を作成します。呼び出し元が SDC_TOPOLOGY_SUPPLIED を指定する場合、numModeInfoArrayElements パラメーターをゼロに、modeInfoArray パラメーターを NULL に設定する必要があります。ただし、呼び出し元は必要なパス情報のために pathArray および numPathArrayElements パラメーターを設定する必要があります。呼び出し元は、このパスデータ内のすべてのソースおよびターゲットのモードインデックスを無効(DISPLAYCONFIG_PATH_MODE_IDX_INVALID)としてマークする必要があります。

次の表は、SetDisplayConfig が呼び出される一般的なシナリオと、それらのシナリオを実現するために呼び出し元が Flags パラメーターに渡すフラグの組み合わせをいくつか示しています。

シナリオ フラグの組み合わせ
指定されたディスプレイ構成がコンピューターでサポートされているかどうかをテストする SDC_VALIDATE | SDC_USE_SUPPLIED_DISPLAY_CONFIG
指定されたディスプレイ構成を設定してデータベースに保存する SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_SAVE_TO_DATABASE
一時的なディスプレイ構成を設定する(すなわち、ディスプレイ構成は保存されない) SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG
クローンがコンピューターでサポートされているかどうかをテストする SDC_VALIDATE | SDC_TOPOLOGY_CLONE
クローントポロジを設定する SDC_APPLY | SDC_TOPOLOGY_CLONE
クローントポロジを設定し、要求を満たすために必要であればパスの永続化を有効化できるようにする SDC_APPLY | SDC_TOPOLOGY_CLONE | SDC_PATH_PERSIST_IF_REQUIRED
一時的なモードから、最後に保存されたディスプレイ構成に戻す SDC_APPLY| SDC_USE_DATABASE_CURRENT
パス情報のみが与えられた状態で、それらのパスに対するデータベースのソースおよびターゲットの情報を使ってディスプレイ構成を設定し、パス順序を無視する SDC_APPLY | SDC_TOPOLOGY_SUPPLIED | SDC_ALLOW_PATH_ORDER_CHANGES

DPI 仮想化

この API は DPI 仮想化に関与しません。DEVMODE 構造体内のすべてのサイズは物理ピクセル単位であり、呼び出し元のコンテキストとは関係ありません。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// USER32.dll
#include <windows.h>

INT SetDisplayConfig(
    DWORD numPathArrayElements,
    DISPLAYCONFIG_PATH_INFO* pathArray,   // optional
    DWORD numModeInfoArrayElements,
    DISPLAYCONFIG_MODE_INFO* modeInfoArray,   // optional
    SET_DISPLAY_CONFIG_FLAGS flags
);
[DllImport("USER32.dll", ExactSpelling = true)]
static extern int SetDisplayConfig(
    uint numPathArrayElements,   // DWORD
    IntPtr pathArray,   // DISPLAYCONFIG_PATH_INFO* optional
    uint numModeInfoArrayElements,   // DWORD
    IntPtr modeInfoArray,   // DISPLAYCONFIG_MODE_INFO* optional
    uint flags   // SET_DISPLAY_CONFIG_FLAGS
);
<DllImport("USER32.dll", ExactSpelling:=True)>
Public Shared Function SetDisplayConfig(
    numPathArrayElements As UInteger,   ' DWORD
    pathArray As IntPtr,   ' DISPLAYCONFIG_PATH_INFO* optional
    numModeInfoArrayElements As UInteger,   ' DWORD
    modeInfoArray As IntPtr,   ' DISPLAYCONFIG_MODE_INFO* optional
    flags As UInteger   ' SET_DISPLAY_CONFIG_FLAGS
) As Integer
End Function
' numPathArrayElements : DWORD
' pathArray : DISPLAYCONFIG_PATH_INFO* optional
' numModeInfoArrayElements : DWORD
' modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional
' flags : SET_DISPLAY_CONFIG_FLAGS
Declare PtrSafe Function SetDisplayConfig Lib "user32" ( _
    ByVal numPathArrayElements As Long, _
    ByVal pathArray As LongPtr, _
    ByVal numModeInfoArrayElements As Long, _
    ByVal modeInfoArray As LongPtr, _
    ByVal flags As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

SetDisplayConfig = ctypes.windll.user32.SetDisplayConfig
SetDisplayConfig.restype = ctypes.c_int
SetDisplayConfig.argtypes = [
    wintypes.DWORD,  # numPathArrayElements : DWORD
    ctypes.c_void_p,  # pathArray : DISPLAYCONFIG_PATH_INFO* optional
    wintypes.DWORD,  # numModeInfoArrayElements : DWORD
    ctypes.c_void_p,  # modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional
    wintypes.DWORD,  # flags : SET_DISPLAY_CONFIG_FLAGS
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('USER32.dll')
SetDisplayConfig = Fiddle::Function.new(
  lib['SetDisplayConfig'],
  [
    -Fiddle::TYPE_INT,  # numPathArrayElements : DWORD
    Fiddle::TYPE_VOIDP,  # pathArray : DISPLAYCONFIG_PATH_INFO* optional
    -Fiddle::TYPE_INT,  # numModeInfoArrayElements : DWORD
    Fiddle::TYPE_VOIDP,  # modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional
    -Fiddle::TYPE_INT,  # flags : SET_DISPLAY_CONFIG_FLAGS
  ],
  Fiddle::TYPE_INT)
#[link(name = "user32")]
extern "system" {
    fn SetDisplayConfig(
        numPathArrayElements: u32,  // DWORD
        pathArray: *mut DISPLAYCONFIG_PATH_INFO,  // DISPLAYCONFIG_PATH_INFO* optional
        numModeInfoArrayElements: u32,  // DWORD
        modeInfoArray: *mut DISPLAYCONFIG_MODE_INFO,  // DISPLAYCONFIG_MODE_INFO* optional
        flags: u32  // SET_DISPLAY_CONFIG_FLAGS
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("USER32.dll")]
public static extern int SetDisplayConfig(uint numPathArrayElements, IntPtr pathArray, uint numModeInfoArrayElements, IntPtr modeInfoArray, uint flags);
"@
$api = Add-Type -MemberDefinition $sig -Name 'USER32_SetDisplayConfig' -Namespace Win32 -PassThru
# $api::SetDisplayConfig(numPathArrayElements, pathArray, numModeInfoArrayElements, modeInfoArray, flags)
#uselib "USER32.dll"
#func global SetDisplayConfig "SetDisplayConfig" sptr, sptr, sptr, sptr, sptr
; SetDisplayConfig numPathArrayElements, varptr(pathArray), numModeInfoArrayElements, varptr(modeInfoArray), flags   ; 戻り値は stat
; numPathArrayElements : DWORD -> "sptr"
; pathArray : DISPLAYCONFIG_PATH_INFO* optional -> "sptr"
; numModeInfoArrayElements : DWORD -> "sptr"
; modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> "sptr"
; flags : SET_DISPLAY_CONFIG_FLAGS -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "USER32.dll"
#cfunc global SetDisplayConfig "SetDisplayConfig" int, var, int, var, int
; res = SetDisplayConfig(numPathArrayElements, pathArray, numModeInfoArrayElements, modeInfoArray, flags)
; numPathArrayElements : DWORD -> "int"
; pathArray : DISPLAYCONFIG_PATH_INFO* optional -> "var"
; numModeInfoArrayElements : DWORD -> "int"
; modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> "var"
; flags : SET_DISPLAY_CONFIG_FLAGS -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; INT SetDisplayConfig(DWORD numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, DWORD numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, SET_DISPLAY_CONFIG_FLAGS flags)
#uselib "USER32.dll"
#cfunc global SetDisplayConfig "SetDisplayConfig" int, var, int, var, int
; res = SetDisplayConfig(numPathArrayElements, pathArray, numModeInfoArrayElements, modeInfoArray, flags)
; numPathArrayElements : DWORD -> "int"
; pathArray : DISPLAYCONFIG_PATH_INFO* optional -> "var"
; numModeInfoArrayElements : DWORD -> "int"
; modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> "var"
; flags : SET_DISPLAY_CONFIG_FLAGS -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	user32 = windows.NewLazySystemDLL("USER32.dll")
	procSetDisplayConfig = user32.NewProc("SetDisplayConfig")
)

// numPathArrayElements (DWORD), pathArray (DISPLAYCONFIG_PATH_INFO* optional), numModeInfoArrayElements (DWORD), modeInfoArray (DISPLAYCONFIG_MODE_INFO* optional), flags (SET_DISPLAY_CONFIG_FLAGS)
r1, _, err := procSetDisplayConfig.Call(
	uintptr(numPathArrayElements),
	uintptr(pathArray),
	uintptr(numModeInfoArrayElements),
	uintptr(modeInfoArray),
	uintptr(flags),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // INT
function SetDisplayConfig(
  numPathArrayElements: DWORD;   // DWORD
  pathArray: Pointer;   // DISPLAYCONFIG_PATH_INFO* optional
  numModeInfoArrayElements: DWORD;   // DWORD
  modeInfoArray: Pointer;   // DISPLAYCONFIG_MODE_INFO* optional
  flags: DWORD   // SET_DISPLAY_CONFIG_FLAGS
): Integer; stdcall;
  external 'USER32.dll' name 'SetDisplayConfig';
result := DllCall("USER32\SetDisplayConfig"
    , "UInt", numPathArrayElements   ; DWORD
    , "Ptr", pathArray   ; DISPLAYCONFIG_PATH_INFO* optional
    , "UInt", numModeInfoArrayElements   ; DWORD
    , "Ptr", modeInfoArray   ; DISPLAYCONFIG_MODE_INFO* optional
    , "UInt", flags   ; SET_DISPLAY_CONFIG_FLAGS
    , "Int")   ; return: INT
●SetDisplayConfig(numPathArrayElements, pathArray, numModeInfoArrayElements, modeInfoArray, flags) = DLL("USER32.dll", "int SetDisplayConfig(dword, void*, dword, void*, dword)")
# 呼び出し: SetDisplayConfig(numPathArrayElements, pathArray, numModeInfoArrayElements, modeInfoArray, flags)
# numPathArrayElements : DWORD -> "dword"
# pathArray : DISPLAYCONFIG_PATH_INFO* optional -> "void*"
# numModeInfoArrayElements : DWORD -> "dword"
# modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> "void*"
# flags : SET_DISPLAY_CONFIG_FLAGS -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "user32" fn SetDisplayConfig(
    numPathArrayElements: u32, // DWORD
    pathArray: [*c]DISPLAYCONFIG_PATH_INFO, // DISPLAYCONFIG_PATH_INFO* optional
    numModeInfoArrayElements: u32, // DWORD
    modeInfoArray: [*c]DISPLAYCONFIG_MODE_INFO, // DISPLAYCONFIG_MODE_INFO* optional
    flags: u32 // SET_DISPLAY_CONFIG_FLAGS
) callconv(std.os.windows.WINAPI) i32;
proc SetDisplayConfig(
    numPathArrayElements: uint32,  # DWORD
    pathArray: ptr DISPLAYCONFIG_PATH_INFO,  # DISPLAYCONFIG_PATH_INFO* optional
    numModeInfoArrayElements: uint32,  # DWORD
    modeInfoArray: ptr DISPLAYCONFIG_MODE_INFO,  # DISPLAYCONFIG_MODE_INFO* optional
    flags: uint32  # SET_DISPLAY_CONFIG_FLAGS
): int32 {.importc: "SetDisplayConfig", stdcall, dynlib: "USER32.dll".}
pragma(lib, "user32");
extern(Windows)
int SetDisplayConfig(
    uint numPathArrayElements,   // DWORD
    DISPLAYCONFIG_PATH_INFO* pathArray,   // DISPLAYCONFIG_PATH_INFO* optional
    uint numModeInfoArrayElements,   // DWORD
    DISPLAYCONFIG_MODE_INFO* modeInfoArray,   // DISPLAYCONFIG_MODE_INFO* optional
    uint flags   // SET_DISPLAY_CONFIG_FLAGS
);
ccall((:SetDisplayConfig, "USER32.dll"), stdcall, Int32,
      (UInt32, Ptr{DISPLAYCONFIG_PATH_INFO}, UInt32, Ptr{DISPLAYCONFIG_MODE_INFO}, UInt32),
      numPathArrayElements, pathArray, numModeInfoArrayElements, modeInfoArray, flags)
# numPathArrayElements : DWORD -> UInt32
# pathArray : DISPLAYCONFIG_PATH_INFO* optional -> Ptr{DISPLAYCONFIG_PATH_INFO}
# numModeInfoArrayElements : DWORD -> UInt32
# modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> Ptr{DISPLAYCONFIG_MODE_INFO}
# flags : SET_DISPLAY_CONFIG_FLAGS -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t SetDisplayConfig(
    uint32_t numPathArrayElements,
    void* pathArray,
    uint32_t numModeInfoArrayElements,
    void* modeInfoArray,
    uint32_t flags);
]]
local user32 = ffi.load("user32")
-- user32.SetDisplayConfig(numPathArrayElements, pathArray, numModeInfoArrayElements, modeInfoArray, flags)
-- numPathArrayElements : DWORD
-- pathArray : DISPLAYCONFIG_PATH_INFO* optional
-- numModeInfoArrayElements : DWORD
-- modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional
-- flags : SET_DISPLAY_CONFIG_FLAGS
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('USER32.dll');
const SetDisplayConfig = lib.func('__stdcall', 'SetDisplayConfig', 'int32_t', ['uint32_t', 'void *', 'uint32_t', 'void *', 'uint32_t']);
// SetDisplayConfig(numPathArrayElements, pathArray, numModeInfoArrayElements, modeInfoArray, flags)
// numPathArrayElements : DWORD -> 'uint32_t'
// pathArray : DISPLAYCONFIG_PATH_INFO* optional -> 'void *'
// numModeInfoArrayElements : DWORD -> 'uint32_t'
// modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> 'void *'
// flags : SET_DISPLAY_CONFIG_FLAGS -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("USER32.dll", {
  SetDisplayConfig: { parameters: ["u32", "pointer", "u32", "pointer", "u32"], result: "i32" },
});
// lib.symbols.SetDisplayConfig(numPathArrayElements, pathArray, numModeInfoArrayElements, modeInfoArray, flags)
// numPathArrayElements : DWORD -> "u32"
// pathArray : DISPLAYCONFIG_PATH_INFO* optional -> "pointer"
// numModeInfoArrayElements : DWORD -> "u32"
// modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> "pointer"
// flags : SET_DISPLAY_CONFIG_FLAGS -> "u32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t SetDisplayConfig(
    uint32_t numPathArrayElements,
    void* pathArray,
    uint32_t numModeInfoArrayElements,
    void* modeInfoArray,
    uint32_t flags);
C, "USER32.dll");
// $ffi->SetDisplayConfig(numPathArrayElements, pathArray, numModeInfoArrayElements, modeInfoArray, flags);
// numPathArrayElements : DWORD
// pathArray : DISPLAYCONFIG_PATH_INFO* optional
// numModeInfoArrayElements : DWORD
// modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional
// flags : SET_DISPLAY_CONFIG_FLAGS
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface User32 extends StdCallLibrary {
    User32 INSTANCE = Native.load("user32", User32.class);
    int SetDisplayConfig(
        int numPathArrayElements,   // DWORD
        Pointer pathArray,   // DISPLAYCONFIG_PATH_INFO* optional
        int numModeInfoArrayElements,   // DWORD
        Pointer modeInfoArray,   // DISPLAYCONFIG_MODE_INFO* optional
        int flags   // SET_DISPLAY_CONFIG_FLAGS
    );
}
@[Link("user32")]
lib LibUSER32
  fun SetDisplayConfig = SetDisplayConfig(
    numPathArrayElements : UInt32,   # DWORD
    pathArray : DISPLAYCONFIG_PATH_INFO*,   # DISPLAYCONFIG_PATH_INFO* optional
    numModeInfoArrayElements : UInt32,   # DWORD
    modeInfoArray : DISPLAYCONFIG_MODE_INFO*,   # DISPLAYCONFIG_MODE_INFO* optional
    flags : UInt32   # SET_DISPLAY_CONFIG_FLAGS
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef SetDisplayConfigNative = Int32 Function(Uint32, Pointer<Void>, Uint32, Pointer<Void>, Uint32);
typedef SetDisplayConfigDart = int Function(int, Pointer<Void>, int, Pointer<Void>, int);
final SetDisplayConfig = DynamicLibrary.open('USER32.dll')
    .lookupFunction<SetDisplayConfigNative, SetDisplayConfigDart>('SetDisplayConfig');
// numPathArrayElements : DWORD -> Uint32
// pathArray : DISPLAYCONFIG_PATH_INFO* optional -> Pointer<Void>
// numModeInfoArrayElements : DWORD -> Uint32
// modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> Pointer<Void>
// flags : SET_DISPLAY_CONFIG_FLAGS -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function SetDisplayConfig(
  numPathArrayElements: DWORD;   // DWORD
  pathArray: Pointer;   // DISPLAYCONFIG_PATH_INFO* optional
  numModeInfoArrayElements: DWORD;   // DWORD
  modeInfoArray: Pointer;   // DISPLAYCONFIG_MODE_INFO* optional
  flags: DWORD   // SET_DISPLAY_CONFIG_FLAGS
): Integer; stdcall;
  external 'USER32.dll' name 'SetDisplayConfig';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "SetDisplayConfig"
  c_SetDisplayConfig :: Word32 -> Ptr () -> Word32 -> Ptr () -> Word32 -> IO Int32
-- numPathArrayElements : DWORD -> Word32
-- pathArray : DISPLAYCONFIG_PATH_INFO* optional -> Ptr ()
-- numModeInfoArrayElements : DWORD -> Word32
-- modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> Ptr ()
-- flags : SET_DISPLAY_CONFIG_FLAGS -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let setdisplayconfig =
  foreign "SetDisplayConfig"
    (uint32_t @-> (ptr void) @-> uint32_t @-> (ptr void) @-> uint32_t @-> returning int32_t)
(* numPathArrayElements : DWORD -> uint32_t *)
(* pathArray : DISPLAYCONFIG_PATH_INFO* optional -> (ptr void) *)
(* numModeInfoArrayElements : DWORD -> uint32_t *)
(* modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> (ptr void) *)
(* flags : SET_DISPLAY_CONFIG_FLAGS -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library user32 (t "USER32.dll"))
(cffi:use-foreign-library user32)

(cffi:defcfun ("SetDisplayConfig" set-display-config :convention :stdcall) :int32
  (num-path-array-elements :uint32)   ; DWORD
  (path-array :pointer)   ; DISPLAYCONFIG_PATH_INFO* optional
  (num-mode-info-array-elements :uint32)   ; DWORD
  (mode-info-array :pointer)   ; DISPLAYCONFIG_MODE_INFO* optional
  (flags :uint32))   ; SET_DISPLAY_CONFIG_FLAGS
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $SetDisplayConfig = Win32::API::More->new('USER32',
    'int SetDisplayConfig(DWORD numPathArrayElements, LPVOID pathArray, DWORD numModeInfoArrayElements, LPVOID modeInfoArray, DWORD flags)');
# my $ret = $SetDisplayConfig->Call($numPathArrayElements, $pathArray, $numModeInfoArrayElements, $modeInfoArray, $flags);
# numPathArrayElements : DWORD -> DWORD
# pathArray : DISPLAYCONFIG_PATH_INFO* optional -> LPVOID
# numModeInfoArrayElements : DWORD -> DWORD
# modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> LPVOID
# flags : SET_DISPLAY_CONFIG_FLAGS -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型