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

DROPSTRUCT

構造体
サイズx64: 48 バイト / x86: 28 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
hwndSourceHWND8/4+0+0ドロップ元(ソース)ウィンドウのハンドルである。
hwndSinkHWND8/4+8+4ドロップ先(シンク)ウィンドウのハンドルである。
wFmtDWORD4+16+8ドロップされたデータの形式である。
dwDataUINT_PTR8/4+24+12ドロップに関連付けられたアプリケーション定義のデータである。
ptDropPOINT8+32+16ドロップが発生した位置(クライアント座標の POINT)である。
dwControlDataDWORD4+40+24コントロール固有のデータである。

各言語での定義

#include <windows.h>

// POINT  (x64 8 / x86 8 バイト)
typedef struct POINT {
    INT x;
    INT y;
} POINT;

// DROPSTRUCT  (x64 48 / x86 28 バイト)
typedef struct DROPSTRUCT {
    HWND hwndSource;
    HWND hwndSink;
    DWORD wFmt;
    UINT_PTR dwData;
    POINT ptDrop;
    DWORD dwControlData;
} DROPSTRUCT;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct POINT
{
    public int x;
    public int y;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DROPSTRUCT
{
    public IntPtr hwndSource;
    public IntPtr hwndSink;
    public uint wFmt;
    public UIntPtr dwData;
    public POINT ptDrop;
    public uint dwControlData;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure POINT
    Public x As Integer
    Public y As Integer
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DROPSTRUCT
    Public hwndSource As IntPtr
    Public hwndSink As IntPtr
    Public wFmt As UInteger
    Public dwData As UIntPtr
    Public ptDrop As POINT
    Public dwControlData As UInteger
End Structure
import ctypes
from ctypes import wintypes

class POINT(ctypes.Structure):
    _fields_ = [
        ("x", ctypes.c_int),
        ("y", ctypes.c_int),
    ]

class DROPSTRUCT(ctypes.Structure):
    _fields_ = [
        ("hwndSource", ctypes.c_void_p),
        ("hwndSink", ctypes.c_void_p),
        ("wFmt", wintypes.DWORD),
        ("dwData", ctypes.c_size_t),
        ("ptDrop", POINT),
        ("dwControlData", wintypes.DWORD),
    ]
#[repr(C)]
pub struct POINT {
    pub x: i32,
    pub y: i32,
}

#[repr(C)]
pub struct DROPSTRUCT {
    pub hwndSource: *mut core::ffi::c_void,
    pub hwndSink: *mut core::ffi::c_void,
    pub wFmt: u32,
    pub dwData: usize,
    pub ptDrop: POINT,
    pub dwControlData: u32,
}
import "golang.org/x/sys/windows"

type POINT struct {
	x int32
	y int32
}

type DROPSTRUCT struct {
	hwndSource uintptr
	hwndSink uintptr
	wFmt uint32
	dwData uintptr
	ptDrop POINT
	dwControlData uint32
}
type
  POINT = record
    x: Integer;
    y: Integer;
  end;

  DROPSTRUCT = record
    hwndSource: Pointer;
    hwndSink: Pointer;
    wFmt: DWORD;
    dwData: NativeUInt;
    ptDrop: POINT;
    dwControlData: DWORD;
  end;
const POINT = extern struct {
    x: i32,
    y: i32,
};

const DROPSTRUCT = extern struct {
    hwndSource: ?*anyopaque,
    hwndSink: ?*anyopaque,
    wFmt: u32,
    dwData: usize,
    ptDrop: POINT,
    dwControlData: u32,
};
type
  POINT {.bycopy.} = object
    x: int32
    y: int32

  DROPSTRUCT {.bycopy.} = object
    hwndSource: pointer
    hwndSink: pointer
    wFmt: uint32
    dwData: uint
    ptDrop: POINT
    dwControlData: uint32
struct POINT
{
    int x;
    int y;
}

struct DROPSTRUCT
{
    void* hwndSource;
    void* hwndSink;
    uint wFmt;
    size_t dwData;
    POINT ptDrop;
    uint dwControlData;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; DROPSTRUCT サイズ: 28 バイト(x86)
dim st, 7    ; 4byte整数×7(構造体サイズ 28 / 4 切り上げ)
; hwndSource : HWND (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; hwndSink : HWND (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; wFmt : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; dwData : UINT_PTR (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; ptDrop : POINT (+16, 8byte)  varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; dwControlData : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DROPSTRUCT サイズ: 48 バイト(x64)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; hwndSource : HWND (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; hwndSink : HWND (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; wFmt : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; dwData : UINT_PTR (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; ptDrop : POINT (+32, 8byte)  varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; dwControlData : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global POINT
    #field int x
    #field int y
#endstruct

#defstruct global DROPSTRUCT
    #field intptr hwndSource
    #field intptr hwndSink
    #field int wFmt
    #field intptr dwData
    #field POINT ptDrop
    #field int dwControlData
#endstruct

stdim st, DROPSTRUCT        ; NSTRUCT 変数を確保
st->wFmt = 100
mes "wFmt=" + st->wFmt