42_引数が構造体の値渡しの場合.hsp

sample\hspint64.dll\42_引数が構造体の値渡しの場合.hsp » Plain Format

// hsp3_64.as → hspint64.as の順にインクルードしてください。
// また、varptr や callfunc をマクロで置き換えている都合上、
// hspint64.as のインクルードは なるべく上に書いておくことをお勧めします。
// なお、varptr や callfunc をマクロの置換をしない場合は、以下のコメントを解除してください。
// #define CANCEL_UNDEF_HSPINT64 

#include "hsp3_64.as"
#include "hspint64.as"

#uselib "user32.dll"
#func WindowFromPoint "WindowFromPoint" int, int

// ----------------------------------------------------------
// 引数が構造体の値渡しの場合
// ----------------------------------------------------------
// WindowFromPoint 関数の引数はPOINT構造体ですが、
// ポインタではなく値渡しになっています。
// ポインタであれば、varptr64() または varptr() を使用しますが、
// 値渡しの場合は、呼び方を工夫しないといけません。
// ----------------------------------------------------------

title "マウスカーソル下のウィンドウハンドルを表示します"

repeat
    // 画面消去
    pos 0,0 : color 255,255,255 : boxf : color
    
    // 32bit版だと引数が2つ分割されますが、
    // 64bit版の場合はPOINT構造体が64bit(32 + 32)で収まるので、1つの引数として渡します。
    ; pt = int64(0)
    ; lpoke pt, 0, ginfo_mx
    ; lpoke pt, 4, ginfo_my
    pt = int64(ginfo_mx) | int64(ginfo_my) << 32

    mes "HWND -> " + cfunc64( RET_INT64, WindowFromPoint, pt)
    
    // 下記は失敗します 
    // mes "HWND -> " + cfunc64( RET_INT64, WindowFromPoint, ginfo_mx, ginfo_my)

    wait 12
loop