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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0506
AIAuser32.dll と user32.as の併用(?)9解決


AIA

リンク

2018/5/6(Sun) 14:39:31|NO.84269


#module #uselib "user32.dll" #func GetClientRect "GetClientRect" int, int #func SetWindowLong "SetWindowLongA" int, int, int #func SetParent "SetParent" int, int #func mouse_event "mouse_event" int, int, int, int, int #func keybd_event "keybd_event" int, int, int #uselib "gdi32" #cfunc GetStockObject "GetStockObject" int

このように指定してGetWindowLongを使おうとすると
文法が違うというエラーがでて、
#uselib "user32.dll"を#include "user32.as"に変えると
GetWindowLongは実行されるんですがkeybd_event、mouse_eventを実行すると
"パラメーターの省略はできません"とエラーを吐かれてしまいます



この記事に返信する


GENKI

リンク

2018/5/6(Sun) 15:33:53|NO.84273

> このように指定してGetWindowLongを使おうとすると
> 文法が違うというエラーがでて、

スクリプトに
#func GetWindowLong …
が書いてないので使えません。
登録されていない命令を使おうとしているのでエラーと判定されています。


> #uselib "user32.dll"を#include "user32.as"に変えると
> GetWindowLongは実行されるんですがkeybd_event、mouse_eventを実行すると

user32.as を開いてみてください。
GetWindowLongとkeybd_event、mouse_eventが登録されているのがわかると思います。
user32.asにはuser32.dllをつか貯めの必要な処理をすべて記述してあるので次ようにして使うといいと思います。

#include "user32.as" #include "gdi32.as" …
今探したらgdi32.asもありました。いつの間に…。


> "パラメーターの省略はできません"とエラーを吐かれてしまいます

keybd_eventは4つです。
https://msdn.microsoft.com/ja-jp/library/cc364822.aspx



AIA

リンク

2018/5/6(Sun) 16:20:25|NO.84274

#func GetWindowLong...のやつを足してみたのですが今度は
SetWindowLongのほうで命令が間違っているといわれてしまい...すでにSetWindowLongの
#funcはあるので全くわかりません....

user32.asを見ましたがすごい量入ってますね



AIA

リンク

2018/5/6(Sun) 16:30:35|NO.84275

http://lhsp.s206.xrea.com/hsp_mouse.html

ここに乗っている通りにやって

keybd_event $2 wait 2 keybd_event $4
とやると"パラメーターの省略はできません"とエラーを吐かれてしまいます



GENKI

リンク

2018/5/6(Sun) 17:32:48|NO.84280

keybd_eventならこっちですね。
http://lhsp.s206.xrea.com/hsp_keyboard.html

こういう所がuser32.asの敷居が高い所というか…user32.asでは引数の指定がintではなくsptrになっているので、パラメータが省略できないのはそのせいだと思います。
HDLの#funcの項に書いててほしいですよね。なんで書いてないんだろう。

ですのでこのように使います。

#uselib "user32" #func global keybd_event "keybd_event" sptr,sptr,sptr,sptr ; Windowsキーを押して離します。 keybd_event $5B,0,0,0 keybd_event $5B,0,2,0
省略できないと出るんだから省略してはいけません。0も省略してはいけません。


> SetWindowLongのほうで命令が間違っているといわれてしまい...すでにSetWindowLongの

そういうときはエラーメッセージを載せてもらえると解決しやすくなります。

> #Error:定義済みの識別子は使用できません [setwindowlonga] in line ? [???]

こんなエラーメッセージではなかったでしょうか。私の推測なので間違っていたらごめんなさい。
もしこのメッセージなら #include "user32.as" したあとに #func SetWindowLong …していませんか?
SetWindowLong は user32.as内で定義済みなので同じ名前は使用できません。



あらや

リンク

2018/5/6(Sun) 17:42:30|NO.84281

GENKIさんとほぼ同じ意見になりますが

#funcで引数をintにすると省略可(省略した引数は0となる)
sptrにすると省略不可になるようです。

user32.asは引数が全てsptrなので省略できないのでしょう。

>HDLの#funcの項に書いててほしいですよね。なんで書いてないんだろう。
その通りですね。
おかげで省略可、不可を初めて知りました。


Kpanさんのソースではkeybd_eventの引数を3つにしていますが
最後の4つ目の引数は追加情報になる物で、
まず使わないため無視したんだと思います。



AIA

リンク

2018/5/6(Sun) 21:28:31|NO.84282

ありがとうございます!!見事にできました!

あともう一つだけ聞きたいのですが
ラジオボタンの状態を取得するにはどうすればよいのでしょうか
http://lhsp.s206.xrea.com/hsp_object1.html」ここを見たのですが


; グループ1用 repeat 3, 0 ; BM_SETCHECK sendmsg objinfo(cnt, 2), $F0 if stat : mes cnt loop ; グループ2用 repeat 3, 3 sendmsg objinfo(cnt, 2), $F0 if stat : mes cnt loop ; グループ3用 (トグルボタン型) repeat 3, 6 sendmsg objinfo(cnt, 2), $F0 if stat : mes cnt loop
この部分を見て

repeat 3, 10 sendmsg objinfo(cnt, 2), $F0 if stat : mes cnt loop
と作ったらこの2行目のところに「パラメータの値が異常です」
と出てきてしまいました...書いてある通りにしたはずなんですがなにがおかしいのでしょうか



あらや

リンク

2018/5/6(Sun) 22:19:19|NO.84283

>repeat 3, 10
いくつのオブジェクトを用意したのかわかりませんが
リピートが10から3回ということは
objinfo(cnt, 2)で参照されるcnt値は 10 11 12 ですから
少なくともオブジェクトが13個無いとウィンドウハンドルが取得できません。

たぶんもっと少ないオブジェクトしか用意していないから
エラーになったのでしょう。



GENKI

リンク

2018/5/6(Sun) 23:58:04|NO.84285

解決したようで何よりです。

質問内容が変わるならスレッドも立て直したほうがいいのですが…まいいか。
あらやさんの説明の捕捉です。こうすると何が起きているのか分かりやすいと思います。

repeat 15 chkbox "チェック"+cnt, z3 loop repeat 3, 10 sendmsg objinfo(cnt, 2), $F4, $9 ;分かりやすいようラジオボタンに変更 if stat : mes cnt loop
あとはrepeatとobjinfoのマニュアルをよく読んでみてください。


> おかげで省略可、不可を初めて知りました。
じつは私も今回の件で調べ直してる時にはじめて気づきました。



AIA

リンク

2018/5/7(Mon) 00:01:25|NO.84286

皆さんありがとうございます!

とりあえず参考にしつつ後日新しくスレッドを立て直したいと思います
非常に参考になりました



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