> このHWND型は32bitアプリケーションだと4バイト(32bit)で、
> 64bitアプリケーションだと8バイト(64bit)です。
64bit環境では確かにHWND型は64bitなのですが、
32bitの相互運用性のために下位32bitしか使っていなかったりします。
https://docs.microsoft.com/ja-jp/windows/win32/winprog64/interprocess-communication
今回の問題は、引数の指定方法に問題があります。
詳しい説明は割愛しますが、意図したとおりにWindowFromPoint関数に引数の情報が渡っていません。
C# : 「64bitだとWindowFromPointが動かないよー」という過去の課題が見つかったのでちょいと調べる
http://pieceofnostalgy.blogspot.com/2018/11/c-64bitwindowfrompoint.html
また、64bit版のobjinfoも32bit版と挙動が異なっており、
オブジェクトのウィンドウハンドルを取得するには通常
handle = objinfo(id, 2)
としますが、64bitランタイムでは
handle = objinfo(id, 4)
とします。
幸いなことに、hspint64.dll というプラグインを使用すれば対応できるので、
サンプルを書いてみました。
入手先
https://hsp.moe/#hspint64
マニュアル
https://docs.hsp.moe/3.6/reference/hspint64.dll/
#include "hsp3_64.as"
#include "hspint64.as"
// cfunc64i は可変長引数で実行するため、#func の引数は無視されるようです。
// なので、適当な引数で良いみたい。
#uselib "user32.dll"
#cfunc WindowFromPoint "WindowFromPoint"
mes "ボタンの上にマウスを移動してください"
pos 320, 240 : objsize 160, 80
button gosub "対象ボタン", *btn
// 【ポイント】
// 32bit版では オブジェクトのウィンドウハンドルを取得するには 2 を指定していましたが、
// 64bit版では 4 を指定します。
// この数字は HSPOBJINFO構造体内部メンバへアクセスする際のインデックスとして使われているので、
// 32bitと64bitでズレが発生しています。
btn_hwnd = objinfo(stat, 4)
pos 50, 20 : objsize 160, 80
button gosub "対象外ボタン", *btn
repeat
pt = int64(ginfo_mx) | int64(ginfo_my) << 32
tgt_hwnd = cfunc64i(WindowFromPoint, pt)
if (tgt_hwnd == btn_hwnd){
title "対象のボタンの上です"
}else{
title strf("マウス下のハンドル = 0x%08x", tgt_hwnd)
}
wait 10
loop
*btn
return