HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
1004
hebihsp3_64でWindowFromPointを使いたい4未解決


hebi

リンク

2021/10/4(Mon) 10:54:22|NO.94044

WindowFromPointがhsp3_64でうまく動きません。(座標下のウィンドウハンドルが取れない)
どうすれば動くようになりますか?


; ↓コメントアウトして標準ランタイムであれば動作する #include "hsp3_64.as" #uselib "user32.dll" #cfunc WindowFromPoint "WindowFromPoint" int, int mes "ボタンの上にマウスを移動してください" pos 320, 240 : objsize 160, 80 button gosub "対象ボタン", *btn btn_hwnd = objinfo(stat, 2) pos 50, 20 : objsize 160, 80 button gosub "対象外ボタン", *btn repeat tgt_hwnd = WindowFromPoint(ginfo_mx, ginfo_my) if (tgt_hwnd == btn_hwnd){ title "対象のボタンの上です" }else{ title "" } wait 10 loop *btn return



この記事に返信する


とあるプログラマ

リンク

2021/10/4(Mon) 11:28:36|NO.94045

WindowFromPointの戻り値の型は HWND 型ですが、このHWND型は32bitアプリケーションだと4バイト(32bit)で、64bitアプリケーションだと8バイト(64bit)です。

つまり64bitアプリケーションでHWND型を受け取るには64bitの変数が必要なのですが、現状のHSP3は64bitランタイムであっても64bit整数型変数をサポートしていないので、通常の方法では64bitな戻り値を得ることは不可能です。

http://hsp.tv/play/pforum.php?mode=pastwch&num=71162


リンク先のスレッドを参照して無理やり64bitを受け取るようにすればいけるかも…?



zrs90(5さい)

リンク

2021/10/4(Mon) 13:32:01|NO.94046

...私は、回答するレベルには
達してないのですが...

当掲示板の一番下にある、サイト内検索の
入力から、hsp3_64を入力して
サイト内検索左のルーペボタンを押すと
一度Google検索(※設定してあるブラウザによりますが)
に繋がり、関連する掲示板の記事をある程度、まとめて
読むことが出来ます。
(※上で、とあるプログラマさんが回答していたスレッドも含みます)

スレッド内のリンク先に、意外な解決策?があるかも...
(※古いスレッドはリンク切れの場合があります)



TOMATO

リンク

2021/10/4(Mon) 14:48:27|NO.94047

> この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



nishiki

リンク

2021/10/4(Mon) 16:32:34|NO.94048

バグ大杉



ONION software Copyright 1997-2023(c) All rights reserved.