Win32 API 日本語リファレンス
ホームUI.WindowsAndMessaging › UpdateLayeredWindow

UpdateLayeredWindow

関数
レイヤードウィンドウの位置や形状や不透明度を更新する。
DLLUSER32.dll呼出規約winapiSetLastErrorあり対応OSWindows 2000 以降

シグネチャ

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

BOOL UpdateLayeredWindow(
    HWND hWnd,
    HDC hdcDst,   // optional
    POINT* pptDst,   // optional
    SIZE* psize,   // optional
    HDC hdcSrc,   // optional
    POINT* pptSrc,   // optional
    COLORREF crKey,
    BLENDFUNCTION* pblend,   // optional
    UPDATE_LAYERED_WINDOW_FLAGS dwFlags
);

パラメーター

名前方向説明
hWndHWNDin

レイヤードウィンドウへのハンドルです。レイヤードウィンドウは、CreateWindowEx 関数でウィンドウを作成する際に WS_EX_LAYERED を指定することで作成します。

Windows 8: WS_EX_LAYERED スタイルは、トップレベルウィンドウと子ウィンドウでサポートされます。以前のバージョンの Windows では、WS_EX_LAYERED はトップレベルウィンドウでのみサポートされます。

hdcDstHDCinoptional

画面の DC へのハンドルです。このハンドルは、GetDC 関数を呼び出す際に NULL を指定することで取得します。ウィンドウの内容が更新されるときのパレットのカラーマッチングに使用されます。hdcDstNULL の場合は、既定のパレットが使用されます。

hdcSrcNULL の場合、hdcDstNULL でなければなりません。

pptDstPOINT*inoptionalレイヤードウィンドウの新しい画面位置を指定する構造体へのポインターです。現在の位置を変更しない場合は、pptDstNULL にできます。
psizeSIZE*inoptionalレイヤードウィンドウの新しいサイズを指定する構造体へのポインターです。ウィンドウのサイズを変更しない場合は、psizeNULL にできます。hdcSrcNULL の場合、psizeNULL でなければなりません。
hdcSrcHDCinoptionalレイヤードウィンドウを定義するサーフェスの DC へのハンドルです。このハンドルは、CreateCompatibleDC 関数を呼び出すことで取得できます。ウィンドウの形状と表示内容を変更しない場合は、hdcSrcNULL にできます。
pptSrcPOINT*inoptionalデバイスコンテキスト内のレイヤーの位置を指定する構造体へのポインターです。hdcSrcNULL の場合は、pptSrcNULL にする必要があります。
crKeyCOLORREFinレイヤードウィンドウの合成時に使用するカラーキーを指定する構造体です。COLORREF を生成するには、RGB マクロを使用します。
pblendBLENDFUNCTION*inoptionalレイヤードウィンドウの合成時に使用する透明度の値を指定する構造体へのポインターです。
dwFlagsUPDATE_LAYERED_WINDOW_FLAGSin

このパラメーターには、次の値のいずれかを指定できます。

意味
ULW_ALPHA
0x00000002
pblend をブレンド関数として使用します。表示モードが 256 色以下の場合、この値の効果は ULW_OPAQUE の効果と同じになります。
ULW_COLORKEY
0x00000001
crKey を透明色として使用します。
ULW_OPAQUE
0x00000004
不透明なレイヤードウィンドウを描画します。
ULW_EX_NORESIZE
0x00000008
現在のウィンドウサイズが psize で指定されたサイズと一致しない場合に、UpdateLayeredWindowIndirect 関数を強制的に失敗させます。

hdcSrcNULL の場合、dwFlags はゼロにする必要があります。

戻り値の型: BOOL

公式ドキュメント

レイヤードウィンドウの位置、サイズ、形状、内容、および半透明度を更新します。

戻り値

型: BOOL

関数が成功した場合、戻り値はゼロ以外の値です。

関数が失敗した場合、戻り値はゼロです。拡張エラー情報を取得するには、GetLastError を呼び出します。

解説(Remarks)

ソース DC には、レイヤードウィンドウの表示内容を定義するサーフェスを含める必要があります。たとえば、CreateCompatibleDC 関数を呼び出して取得したデバイスコンテキストにビットマップを選択できます。

アプリケーションは、ミラーリングモードを適切に設定するために、hdcSrc デバイスコンテキストに対して SetLayout を呼び出す必要があります。SetLayout は、HDC へのすべての描画を適切にミラーリングしつつ、テキストグリフの方向と (オプションで) ビットマップの方向順序を適切に保持します。ただし、デバイス非依存ビットマップ (DIB) のビットへの直接描画は変更できません。詳細については、「Window Layout and Mirroring」を参照してください。

UpdateLayeredWindow 関数は、画面上のウィンドウの外観を維持します。UpdateLayeredWindow の呼び出しによってレイヤードウィンドウの下にあるウィンドウが露出した場合、システムが自動的に再描画するため、これらのウィンドウを再描画する必要はありません。これにより、レイヤードウィンドウのシームレスなアニメーションが可能になります。

UpdateLayeredWindow は常にウィンドウ全体を更新します。ウィンドウの一部を更新するには、従来の WM_PAINT を使用し、SetLayeredWindowAttributes でブレンド値を設定します。

レイヤードウィンドウおよびその下にあるウィンドウの描画パフォーマンスを最適にするには、レイヤードウィンドウをできるだけ小さくする必要があります。また、アプリケーションはディスプレイの色深度が変化したときにメッセージを処理し、レイヤードウィンドウを再作成する必要があります。

詳細については、「Layered Windows」を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

BOOL UpdateLayeredWindow(
    HWND hWnd,
    HDC hdcDst,   // optional
    POINT* pptDst,   // optional
    SIZE* psize,   // optional
    HDC hdcSrc,   // optional
    POINT* pptSrc,   // optional
    COLORREF crKey,
    BLENDFUNCTION* pblend,   // optional
    UPDATE_LAYERED_WINDOW_FLAGS dwFlags
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("USER32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool UpdateLayeredWindow(
    IntPtr hWnd,   // HWND
    IntPtr hdcDst,   // HDC optional
    IntPtr pptDst,   // POINT* optional
    IntPtr psize,   // SIZE* optional
    IntPtr hdcSrc,   // HDC optional
    IntPtr pptSrc,   // POINT* optional
    uint crKey,   // COLORREF
    IntPtr pblend,   // BLENDFUNCTION* optional
    uint dwFlags   // UPDATE_LAYERED_WINDOW_FLAGS
);
<DllImport("USER32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function UpdateLayeredWindow(
    hWnd As IntPtr,   ' HWND
    hdcDst As IntPtr,   ' HDC optional
    pptDst As IntPtr,   ' POINT* optional
    psize As IntPtr,   ' SIZE* optional
    hdcSrc As IntPtr,   ' HDC optional
    pptSrc As IntPtr,   ' POINT* optional
    crKey As UInteger,   ' COLORREF
    pblend As IntPtr,   ' BLENDFUNCTION* optional
    dwFlags As UInteger   ' UPDATE_LAYERED_WINDOW_FLAGS
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' hWnd : HWND
' hdcDst : HDC optional
' pptDst : POINT* optional
' psize : SIZE* optional
' hdcSrc : HDC optional
' pptSrc : POINT* optional
' crKey : COLORREF
' pblend : BLENDFUNCTION* optional
' dwFlags : UPDATE_LAYERED_WINDOW_FLAGS
Declare PtrSafe Function UpdateLayeredWindow Lib "user32" ( _
    ByVal hWnd As LongPtr, _
    ByVal hdcDst As LongPtr, _
    ByVal pptDst As LongPtr, _
    ByVal psize As LongPtr, _
    ByVal hdcSrc As LongPtr, _
    ByVal pptSrc As LongPtr, _
    ByVal crKey As Long, _
    ByVal pblend As LongPtr, _
    ByVal dwFlags As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

UpdateLayeredWindow = ctypes.windll.user32.UpdateLayeredWindow
UpdateLayeredWindow.restype = wintypes.BOOL
UpdateLayeredWindow.argtypes = [
    wintypes.HANDLE,  # hWnd : HWND
    wintypes.HANDLE,  # hdcDst : HDC optional
    ctypes.c_void_p,  # pptDst : POINT* optional
    ctypes.c_void_p,  # psize : SIZE* optional
    wintypes.HANDLE,  # hdcSrc : HDC optional
    ctypes.c_void_p,  # pptSrc : POINT* optional
    wintypes.DWORD,  # crKey : COLORREF
    ctypes.c_void_p,  # pblend : BLENDFUNCTION* optional
    wintypes.DWORD,  # dwFlags : UPDATE_LAYERED_WINDOW_FLAGS
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('USER32.dll')
UpdateLayeredWindow = Fiddle::Function.new(
  lib['UpdateLayeredWindow'],
  [
    Fiddle::TYPE_VOIDP,  # hWnd : HWND
    Fiddle::TYPE_VOIDP,  # hdcDst : HDC optional
    Fiddle::TYPE_VOIDP,  # pptDst : POINT* optional
    Fiddle::TYPE_VOIDP,  # psize : SIZE* optional
    Fiddle::TYPE_VOIDP,  # hdcSrc : HDC optional
    Fiddle::TYPE_VOIDP,  # pptSrc : POINT* optional
    -Fiddle::TYPE_INT,  # crKey : COLORREF
    Fiddle::TYPE_VOIDP,  # pblend : BLENDFUNCTION* optional
    -Fiddle::TYPE_INT,  # dwFlags : UPDATE_LAYERED_WINDOW_FLAGS
  ],
  Fiddle::TYPE_INT)
#[link(name = "user32")]
extern "system" {
    fn UpdateLayeredWindow(
        hWnd: *mut core::ffi::c_void,  // HWND
        hdcDst: *mut core::ffi::c_void,  // HDC optional
        pptDst: *mut POINT,  // POINT* optional
        psize: *mut SIZE,  // SIZE* optional
        hdcSrc: *mut core::ffi::c_void,  // HDC optional
        pptSrc: *mut POINT,  // POINT* optional
        crKey: u32,  // COLORREF
        pblend: *mut BLENDFUNCTION,  // BLENDFUNCTION* optional
        dwFlags: u32  // UPDATE_LAYERED_WINDOW_FLAGS
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("USER32.dll", SetLastError = true)]
public static extern bool UpdateLayeredWindow(IntPtr hWnd, IntPtr hdcDst, IntPtr pptDst, IntPtr psize, IntPtr hdcSrc, IntPtr pptSrc, uint crKey, IntPtr pblend, uint dwFlags);
"@
$api = Add-Type -MemberDefinition $sig -Name 'USER32_UpdateLayeredWindow' -Namespace Win32 -PassThru
# $api::UpdateLayeredWindow(hWnd, hdcDst, pptDst, psize, hdcSrc, pptSrc, crKey, pblend, dwFlags)
#uselib "USER32.dll"
#func global UpdateLayeredWindow "UpdateLayeredWindow" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; UpdateLayeredWindow hWnd, hdcDst, varptr(pptDst), varptr(psize), hdcSrc, varptr(pptSrc), crKey, varptr(pblend), dwFlags   ; 戻り値は stat
; hWnd : HWND -> "sptr"
; hdcDst : HDC optional -> "sptr"
; pptDst : POINT* optional -> "sptr"
; psize : SIZE* optional -> "sptr"
; hdcSrc : HDC optional -> "sptr"
; pptSrc : POINT* optional -> "sptr"
; crKey : COLORREF -> "sptr"
; pblend : BLENDFUNCTION* optional -> "sptr"
; dwFlags : UPDATE_LAYERED_WINDOW_FLAGS -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "USER32.dll"
#cfunc global UpdateLayeredWindow "UpdateLayeredWindow" sptr, sptr, var, var, sptr, var, int, var, int
; res = UpdateLayeredWindow(hWnd, hdcDst, pptDst, psize, hdcSrc, pptSrc, crKey, pblend, dwFlags)
; hWnd : HWND -> "sptr"
; hdcDst : HDC optional -> "sptr"
; pptDst : POINT* optional -> "var"
; psize : SIZE* optional -> "var"
; hdcSrc : HDC optional -> "sptr"
; pptSrc : POINT* optional -> "var"
; crKey : COLORREF -> "int"
; pblend : BLENDFUNCTION* optional -> "var"
; dwFlags : UPDATE_LAYERED_WINDOW_FLAGS -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL UpdateLayeredWindow(HWND hWnd, HDC hdcDst, POINT* pptDst, SIZE* psize, HDC hdcSrc, POINT* pptSrc, COLORREF crKey, BLENDFUNCTION* pblend, UPDATE_LAYERED_WINDOW_FLAGS dwFlags)
#uselib "USER32.dll"
#cfunc global UpdateLayeredWindow "UpdateLayeredWindow" intptr, intptr, var, var, intptr, var, int, var, int
; res = UpdateLayeredWindow(hWnd, hdcDst, pptDst, psize, hdcSrc, pptSrc, crKey, pblend, dwFlags)
; hWnd : HWND -> "intptr"
; hdcDst : HDC optional -> "intptr"
; pptDst : POINT* optional -> "var"
; psize : SIZE* optional -> "var"
; hdcSrc : HDC optional -> "intptr"
; pptSrc : POINT* optional -> "var"
; crKey : COLORREF -> "int"
; pblend : BLENDFUNCTION* optional -> "var"
; dwFlags : UPDATE_LAYERED_WINDOW_FLAGS -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	user32 = windows.NewLazySystemDLL("USER32.dll")
	procUpdateLayeredWindow = user32.NewProc("UpdateLayeredWindow")
)

// hWnd (HWND), hdcDst (HDC optional), pptDst (POINT* optional), psize (SIZE* optional), hdcSrc (HDC optional), pptSrc (POINT* optional), crKey (COLORREF), pblend (BLENDFUNCTION* optional), dwFlags (UPDATE_LAYERED_WINDOW_FLAGS)
r1, _, err := procUpdateLayeredWindow.Call(
	uintptr(hWnd),
	uintptr(hdcDst),
	uintptr(pptDst),
	uintptr(psize),
	uintptr(hdcSrc),
	uintptr(pptSrc),
	uintptr(crKey),
	uintptr(pblend),
	uintptr(dwFlags),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function UpdateLayeredWindow(
  hWnd: THandle;   // HWND
  hdcDst: THandle;   // HDC optional
  pptDst: Pointer;   // POINT* optional
  psize: Pointer;   // SIZE* optional
  hdcSrc: THandle;   // HDC optional
  pptSrc: Pointer;   // POINT* optional
  crKey: DWORD;   // COLORREF
  pblend: Pointer;   // BLENDFUNCTION* optional
  dwFlags: DWORD   // UPDATE_LAYERED_WINDOW_FLAGS
): BOOL; stdcall;
  external 'USER32.dll' name 'UpdateLayeredWindow';
result := DllCall("USER32\UpdateLayeredWindow"
    , "Ptr", hWnd   ; HWND
    , "Ptr", hdcDst   ; HDC optional
    , "Ptr", pptDst   ; POINT* optional
    , "Ptr", psize   ; SIZE* optional
    , "Ptr", hdcSrc   ; HDC optional
    , "Ptr", pptSrc   ; POINT* optional
    , "UInt", crKey   ; COLORREF
    , "Ptr", pblend   ; BLENDFUNCTION* optional
    , "UInt", dwFlags   ; UPDATE_LAYERED_WINDOW_FLAGS
    , "Int")   ; return: BOOL
●UpdateLayeredWindow(hWnd, hdcDst, pptDst, psize, hdcSrc, pptSrc, crKey, pblend, dwFlags) = DLL("USER32.dll", "bool UpdateLayeredWindow(void*, void*, void*, void*, void*, void*, dword, void*, dword)")
# 呼び出し: UpdateLayeredWindow(hWnd, hdcDst, pptDst, psize, hdcSrc, pptSrc, crKey, pblend, dwFlags)
# hWnd : HWND -> "void*"
# hdcDst : HDC optional -> "void*"
# pptDst : POINT* optional -> "void*"
# psize : SIZE* optional -> "void*"
# hdcSrc : HDC optional -> "void*"
# pptSrc : POINT* optional -> "void*"
# crKey : COLORREF -> "dword"
# pblend : BLENDFUNCTION* optional -> "void*"
# dwFlags : UPDATE_LAYERED_WINDOW_FLAGS -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "user32" fn UpdateLayeredWindow(
    hWnd: ?*anyopaque, // HWND
    hdcDst: ?*anyopaque, // HDC optional
    pptDst: [*c]POINT, // POINT* optional
    psize: [*c]SIZE, // SIZE* optional
    hdcSrc: ?*anyopaque, // HDC optional
    pptSrc: [*c]POINT, // POINT* optional
    crKey: u32, // COLORREF
    pblend: [*c]BLENDFUNCTION, // BLENDFUNCTION* optional
    dwFlags: u32 // UPDATE_LAYERED_WINDOW_FLAGS
) callconv(std.os.windows.WINAPI) i32;
proc UpdateLayeredWindow(
    hWnd: pointer,  # HWND
    hdcDst: pointer,  # HDC optional
    pptDst: ptr POINT,  # POINT* optional
    psize: ptr SIZE,  # SIZE* optional
    hdcSrc: pointer,  # HDC optional
    pptSrc: ptr POINT,  # POINT* optional
    crKey: uint32,  # COLORREF
    pblend: ptr BLENDFUNCTION,  # BLENDFUNCTION* optional
    dwFlags: uint32  # UPDATE_LAYERED_WINDOW_FLAGS
): int32 {.importc: "UpdateLayeredWindow", stdcall, dynlib: "USER32.dll".}
pragma(lib, "user32");
extern(Windows)
int UpdateLayeredWindow(
    void* hWnd,   // HWND
    void* hdcDst,   // HDC optional
    POINT* pptDst,   // POINT* optional
    SIZE* psize,   // SIZE* optional
    void* hdcSrc,   // HDC optional
    POINT* pptSrc,   // POINT* optional
    uint crKey,   // COLORREF
    BLENDFUNCTION* pblend,   // BLENDFUNCTION* optional
    uint dwFlags   // UPDATE_LAYERED_WINDOW_FLAGS
);
ccall((:UpdateLayeredWindow, "USER32.dll"), stdcall, Int32,
      (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{POINT}, Ptr{SIZE}, Ptr{Cvoid}, Ptr{POINT}, UInt32, Ptr{BLENDFUNCTION}, UInt32),
      hWnd, hdcDst, pptDst, psize, hdcSrc, pptSrc, crKey, pblend, dwFlags)
# hWnd : HWND -> Ptr{Cvoid}
# hdcDst : HDC optional -> Ptr{Cvoid}
# pptDst : POINT* optional -> Ptr{POINT}
# psize : SIZE* optional -> Ptr{SIZE}
# hdcSrc : HDC optional -> Ptr{Cvoid}
# pptSrc : POINT* optional -> Ptr{POINT}
# crKey : COLORREF -> UInt32
# pblend : BLENDFUNCTION* optional -> Ptr{BLENDFUNCTION}
# dwFlags : UPDATE_LAYERED_WINDOW_FLAGS -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t UpdateLayeredWindow(
    void* hWnd,
    void* hdcDst,
    void* pptDst,
    void* psize,
    void* hdcSrc,
    void* pptSrc,
    uint32_t crKey,
    void* pblend,
    uint32_t dwFlags);
]]
local user32 = ffi.load("user32")
-- user32.UpdateLayeredWindow(hWnd, hdcDst, pptDst, psize, hdcSrc, pptSrc, crKey, pblend, dwFlags)
-- hWnd : HWND
-- hdcDst : HDC optional
-- pptDst : POINT* optional
-- psize : SIZE* optional
-- hdcSrc : HDC optional
-- pptSrc : POINT* optional
-- crKey : COLORREF
-- pblend : BLENDFUNCTION* optional
-- dwFlags : UPDATE_LAYERED_WINDOW_FLAGS
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('USER32.dll');
const UpdateLayeredWindow = lib.func('__stdcall', 'UpdateLayeredWindow', 'int32_t', ['void *', 'void *', 'void *', 'void *', 'void *', 'void *', 'uint32_t', 'void *', 'uint32_t']);
// UpdateLayeredWindow(hWnd, hdcDst, pptDst, psize, hdcSrc, pptSrc, crKey, pblend, dwFlags)
// hWnd : HWND -> 'void *'
// hdcDst : HDC optional -> 'void *'
// pptDst : POINT* optional -> 'void *'
// psize : SIZE* optional -> 'void *'
// hdcSrc : HDC optional -> 'void *'
// pptSrc : POINT* optional -> 'void *'
// crKey : COLORREF -> 'uint32_t'
// pblend : BLENDFUNCTION* optional -> 'void *'
// dwFlags : UPDATE_LAYERED_WINDOW_FLAGS -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("USER32.dll", {
  UpdateLayeredWindow: { parameters: ["pointer", "pointer", "pointer", "pointer", "pointer", "pointer", "u32", "pointer", "u32"], result: "i32" },
});
// lib.symbols.UpdateLayeredWindow(hWnd, hdcDst, pptDst, psize, hdcSrc, pptSrc, crKey, pblend, dwFlags)
// hWnd : HWND -> "pointer"
// hdcDst : HDC optional -> "pointer"
// pptDst : POINT* optional -> "pointer"
// psize : SIZE* optional -> "pointer"
// hdcSrc : HDC optional -> "pointer"
// pptSrc : POINT* optional -> "pointer"
// crKey : COLORREF -> "u32"
// pblend : BLENDFUNCTION* optional -> "pointer"
// dwFlags : UPDATE_LAYERED_WINDOW_FLAGS -> "u32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t UpdateLayeredWindow(
    void* hWnd,
    void* hdcDst,
    void* pptDst,
    void* psize,
    void* hdcSrc,
    void* pptSrc,
    uint32_t crKey,
    void* pblend,
    uint32_t dwFlags);
C, "USER32.dll");
// $ffi->UpdateLayeredWindow(hWnd, hdcDst, pptDst, psize, hdcSrc, pptSrc, crKey, pblend, dwFlags);
// hWnd : HWND
// hdcDst : HDC optional
// pptDst : POINT* optional
// psize : SIZE* optional
// hdcSrc : HDC optional
// pptSrc : POINT* optional
// crKey : COLORREF
// pblend : BLENDFUNCTION* optional
// dwFlags : UPDATE_LAYERED_WINDOW_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);
    boolean UpdateLayeredWindow(
        Pointer hWnd,   // HWND
        Pointer hdcDst,   // HDC optional
        Pointer pptDst,   // POINT* optional
        Pointer psize,   // SIZE* optional
        Pointer hdcSrc,   // HDC optional
        Pointer pptSrc,   // POINT* optional
        int crKey,   // COLORREF
        Pointer pblend,   // BLENDFUNCTION* optional
        int dwFlags   // UPDATE_LAYERED_WINDOW_FLAGS
    );
}
@[Link("user32")]
lib LibUSER32
  fun UpdateLayeredWindow = UpdateLayeredWindow(
    hWnd : Void*,   # HWND
    hdcDst : Void*,   # HDC optional
    pptDst : POINT*,   # POINT* optional
    psize : SIZE*,   # SIZE* optional
    hdcSrc : Void*,   # HDC optional
    pptSrc : POINT*,   # POINT* optional
    crKey : UInt32,   # COLORREF
    pblend : BLENDFUNCTION*,   # BLENDFUNCTION* optional
    dwFlags : UInt32   # UPDATE_LAYERED_WINDOW_FLAGS
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef UpdateLayeredWindowNative = Int32 Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Uint32, Pointer<Void>, Uint32);
typedef UpdateLayeredWindowDart = int Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, int, Pointer<Void>, int);
final UpdateLayeredWindow = DynamicLibrary.open('USER32.dll')
    .lookupFunction<UpdateLayeredWindowNative, UpdateLayeredWindowDart>('UpdateLayeredWindow');
// hWnd : HWND -> Pointer<Void>
// hdcDst : HDC optional -> Pointer<Void>
// pptDst : POINT* optional -> Pointer<Void>
// psize : SIZE* optional -> Pointer<Void>
// hdcSrc : HDC optional -> Pointer<Void>
// pptSrc : POINT* optional -> Pointer<Void>
// crKey : COLORREF -> Uint32
// pblend : BLENDFUNCTION* optional -> Pointer<Void>
// dwFlags : UPDATE_LAYERED_WINDOW_FLAGS -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function UpdateLayeredWindow(
  hWnd: THandle;   // HWND
  hdcDst: THandle;   // HDC optional
  pptDst: Pointer;   // POINT* optional
  psize: Pointer;   // SIZE* optional
  hdcSrc: THandle;   // HDC optional
  pptSrc: Pointer;   // POINT* optional
  crKey: DWORD;   // COLORREF
  pblend: Pointer;   // BLENDFUNCTION* optional
  dwFlags: DWORD   // UPDATE_LAYERED_WINDOW_FLAGS
): BOOL; stdcall;
  external 'USER32.dll' name 'UpdateLayeredWindow';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "UpdateLayeredWindow"
  c_UpdateLayeredWindow :: Ptr () -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> Word32 -> Ptr () -> Word32 -> IO CInt
-- hWnd : HWND -> Ptr ()
-- hdcDst : HDC optional -> Ptr ()
-- pptDst : POINT* optional -> Ptr ()
-- psize : SIZE* optional -> Ptr ()
-- hdcSrc : HDC optional -> Ptr ()
-- pptSrc : POINT* optional -> Ptr ()
-- crKey : COLORREF -> Word32
-- pblend : BLENDFUNCTION* optional -> Ptr ()
-- dwFlags : UPDATE_LAYERED_WINDOW_FLAGS -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let updatelayeredwindow =
  foreign "UpdateLayeredWindow"
    ((ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> uint32_t @-> (ptr void) @-> uint32_t @-> returning int32_t)
(* hWnd : HWND -> (ptr void) *)
(* hdcDst : HDC optional -> (ptr void) *)
(* pptDst : POINT* optional -> (ptr void) *)
(* psize : SIZE* optional -> (ptr void) *)
(* hdcSrc : HDC optional -> (ptr void) *)
(* pptSrc : POINT* optional -> (ptr void) *)
(* crKey : COLORREF -> uint32_t *)
(* pblend : BLENDFUNCTION* optional -> (ptr void) *)
(* dwFlags : UPDATE_LAYERED_WINDOW_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 ("UpdateLayeredWindow" update-layered-window :convention :stdcall) :int32
  (h-wnd :pointer)   ; HWND
  (hdc-dst :pointer)   ; HDC optional
  (ppt-dst :pointer)   ; POINT* optional
  (psize :pointer)   ; SIZE* optional
  (hdc-src :pointer)   ; HDC optional
  (ppt-src :pointer)   ; POINT* optional
  (cr-key :uint32)   ; COLORREF
  (pblend :pointer)   ; BLENDFUNCTION* optional
  (dw-flags :uint32))   ; UPDATE_LAYERED_WINDOW_FLAGS
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $UpdateLayeredWindow = Win32::API::More->new('USER32',
    'BOOL UpdateLayeredWindow(HANDLE hWnd, HANDLE hdcDst, LPVOID pptDst, LPVOID psize, HANDLE hdcSrc, LPVOID pptSrc, DWORD crKey, LPVOID pblend, DWORD dwFlags)');
# my $ret = $UpdateLayeredWindow->Call($hWnd, $hdcDst, $pptDst, $psize, $hdcSrc, $pptSrc, $crKey, $pblend, $dwFlags);
# hWnd : HWND -> HANDLE
# hdcDst : HDC optional -> HANDLE
# pptDst : POINT* optional -> LPVOID
# psize : SIZE* optional -> LPVOID
# hdcSrc : HDC optional -> HANDLE
# pptSrc : POINT* optional -> LPVOID
# crKey : COLORREF -> DWORD
# pblend : BLENDFUNCTION* optional -> LPVOID
# dwFlags : UPDATE_LAYERED_WINDOW_FLAGS -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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