SetDisplayConfig
関数シグネチャ
// 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
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| numPathArrayElements | DWORD | in | pathArray 内の要素数。 | ||||||||||||||||||||||||||||||||||||
| pathArray | DISPLAYCONFIG_PATH_INFO* | inoptional | 設定対象となるすべてのディスプレイパスの配列です。この配列内のパスのうち、DISPLAYCONFIG_PATH_INFO の flags メンバーに DISPLAYCONFIG_PATH_ACTIVE フラグが設定されているパスのみが設定されます。このパラメーターは NULL にできます。この配列内でアクティブなパスが並ぶ順序によってパスの優先順位が決まります。パスの優先順位の詳細については、Path Priority Order を参照してください。 | ||||||||||||||||||||||||||||||||||||
| numModeInfoArrayElements | DWORD | in | modeInfoArray 内の要素数。 | ||||||||||||||||||||||||||||||||||||
| modeInfoArray | DISPLAYCONFIG_MODE_INFO* | inoptional | ディスプレイのソースおよびターゲットのモード情報(DISPLAYCONFIG_MODE_INFO)の配列で、pathArray のパス情報内の DISPLAYCONFIG_PATH_SOURCE_INFO および DISPLAYCONFIG_PATH_TARGET_INFO 要素の modeInfoIdx メンバーによって参照されます。このパラメーターは NULL にできます。 | ||||||||||||||||||||||||||||||||||||
| flags | SET_DISPLAY_CONFIG_FLAGS | in | この関数の動作を示すフラグ値のビット単位の OR です。このパラメーターには、次の値のいずれか、または複数の値の組み合わせを指定できます。0 は無効です。有効なフラグの組み合わせについては、以下の説明を参照してください。
次の一覧は、Flags パラメーターに対する値の有効な組み合わせを示しています。
|
戻り値の型: INT
公式ドキュメント
SetDisplayConfig 関数は、現在のセッションで指定されたパスを排他的に有効化することにより、ディスプレイのトポロジ、ソース、およびターゲットのモードを変更します。
戻り値
この関数は、次のいずれかの戻り値を返します。
| 戻り値 | 説明 |
|---|---|
| 関数が成功しました。 | |
| 指定されたパラメーターとフラグの組み合わせが無効です。 | |
| システムが Windows Display Driver Model (WDDM) に従って記述されたグラフィックスドライバーを実行していません。この関数は、WDDM ドライバーが動作しているシステムでのみサポートされます。 | |
| 呼び出し元がコンソールセッションにアクセスできません。このエラーは、呼び出しプロセスが現在のデスクトップにアクセスできない場合、またはリモートセッションで実行されている場合に発生します。 | |
| 原因不明のエラーが発生しました。 | |
| 呼び出し元が指定しなかったソースおよびターゲットのモードについて、関数が実行可能な解を見つけられませんでした。 |
解説(Remarks)
SetDisplayConfig 関数は、指定されたソースおよびターゲットのモード情報を含むアクティブなディスプレイパスを受け取り、最適モードロジックを使用して、不足しているソースおよびターゲットのモード情報を生成します。その後、この関数は完全なディスプレイパスを設定します。
DISPLAYCONFIG_PATH_SOURCE_INFO および DISPLAYCONFIG_PATH_TARGET_INFO 構造体の ModeInfoIdx メンバーは、特定のアクティブなパスに対してソースおよびターゲットのモードが指定されているかどうかを示すために使用されます。いずれかのインデックス値が DISPLAYCONFIG_PATH_MODE_IDX_INVALID である場合、そのモード情報が指定されていないことを示します。特定のパスについて、パスとソースモード、またはパスとソースおよびターゲットのモード情報を指定することは有効です。ただし、ソースモードを指定せずにパスとターゲットモードを指定することは無効です。
各ソースおよびターゲットの識別子に対するソースおよびターゲットのモードは、modeInfoArray 配列に一度だけ現れます。たとえば、ソース識別子 S1 のソースモードはテーブルに一度だけ現れます。複数のパスが同じソースを参照する場合、それらは同じ ModeInfoIdx を使用する必要があります。
ほとんどの呼び出し元は、QueryDisplayConfig を使用して現在の構成とその他の有効な候補を取得し、その後 SetDisplayConfig を使用して構成のテストと設定を行うことが想定されています。
PathArray 配列内でアクティブなパスが並ぶ順序によって、パスの優先順位が決まります。
既定では、SetDisplayConfig は、指定されたパス、ソースモード、またはターゲットモードの情報を一切変更しません。最適モードロジックが、指定されたディスプレイパス情報を変更せずに解を見つけられない場合、SetDisplayConfig は ERROR_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_CLONE と SDC_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 公式リファレンス: 英語 (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 方式にも切替可。#uselib "USER32.dll" #cfunc global SetDisplayConfig "SetDisplayConfig" int, sptr, int, sptr, int ; res = SetDisplayConfig(numPathArrayElements, varptr(pathArray), numModeInfoArrayElements, varptr(modeInfoArray), flags) ; numPathArrayElements : DWORD -> "int" ; pathArray : DISPLAYCONFIG_PATH_INFO* optional -> "sptr" ; numModeInfoArrayElements : DWORD -> "int" ; modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> "sptr" ; flags : SET_DISPLAY_CONFIG_FLAGS -> "int" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは 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 方式にも切替可。; 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, intptr, int, intptr, int ; res = SetDisplayConfig(numPathArrayElements, varptr(pathArray), numModeInfoArrayElements, varptr(modeInfoArray), flags) ; numPathArrayElements : DWORD -> "int" ; pathArray : DISPLAYCONFIG_PATH_INFO* optional -> "intptr" ; numModeInfoArrayElements : DWORD -> "int" ; modeInfoArray : DISPLAYCONFIG_MODE_INFO* optional -> "intptr" ; flags : SET_DISPLAY_CONFIG_FLAGS -> "int" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは 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 // INTfunction 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 を使用。関連項目
- s DISPLAYCONFIG_PATH_SOURCE_INFO
- s DISPLAYCONFIG_PATH_TARGET_INFO
- f QueryDisplayConfig — ディスプレイのパスとモードの現在構成を取得する。