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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0703
しあ複数のウィンドウ管理20未解決


しあ

リンク

2017/7/3(Mon) 03:35:40|NO.80478

マップエディタ的なやつを作ろうとしているのですが
1のウィンドウでウィンドウのマウス位置で1マス選択して
2のウィンドウをクリックするとまだ移動してる間1のマウスが動いてしまいます

もう一つ、ウィンドウの上に来たらアクティブにしようと思いますが
重なり合うウィンドウの時はどうしたらいいのかわかりません
アドバイスなどあればお聞かせください!



この記事に返信する


ソラ(元スペース)

リンク

2017/7/3(Mon) 17:14:44|NO.80479

>>2のウィンドウをクリックするとまだ移動してる間1のマウスが動いてしまいます
ginfo_actとか参考になりませんか?

>>ウィンドウの上に来たらアクティブに
マウス直下のウインドウハンドルを取得してその値によってgselでアクティブにしてはどうでしょう。
以下はマウス直下のウインドウハンドルを取得するサンプルです。

#uselib "user32.dll" #cfunc WindowFromPoint "WindowFromPoint" int, int repeat title "マウス直下のウインドウハンドルは"+WindowFromPoint(ginfo_mx,ginfo_mx)+"です。このウインドウのハンドルは"+hwnd+"です。" await 100 loop



しあ

リンク

2017/7/3(Mon) 22:26:44|NO.80484

お返事ありがとうございます
ginfo最近使いはじめました
スクリーンのマウスの位置とスクリーンのウィンドウの位置
これで中にいる時だけクリックしたら反応するようにすればなんとかなりそうですね

下のは関数だと思うのですが使い方がわからず基本命令だけでやってます
dllみたいにincludeとは違うし
どう使ったらいいでしょうか
また、作業フォルダでやってる場合そのフォルダにいれるんでしたっけ?



ソラ(元スペース)

リンク

2017/7/3(Mon) 22:48:39|NO.80485

apiの呼び出し方は以下のページが参考になるかと。
http://www.geocities.co.jp/Playtown-Yoyo/6130/hsp/hsp-win32api.html
user32.dll等、windows標準のものは作業フォルダに入れる必要はありません。

>>下のは関数だと思うのですが使い方がわからず基本命令だけでやってます
関数の使い方自体はHSP標準関数と同じです。
win32API等、外部DLLの関数の呼び出し方がわからないのでしたら、上記ページで解説されています。

でも正直全てを理解する必要はなくて、
とりあえず#uselib、#cfunc、#include等の外部DLLの関数を使うために必要な最低限の物を覚えたら、
あとはコピペでいいと思いますよ。



しあ

リンク

2017/7/4(Tue) 02:14:56|NO.80486

サンプル起動してみたのですがハンドルがなにがわからなく
数値の意味が理解できません、そのままgselにウィンドウidの位置においたらいいのでしょうか?

またまた質問ができてしまいました
ウィンドウをクリックで切り替えると反応が遅れるような気がするのですが
改善方法はありますか?
クリックしないで上にきたらアクティブになれば改善できたらいいとは今思ってますが汗



ソラ(元スペース)

リンク

2017/7/4(Tue) 13:24:21|NO.80488

ウインドウハンドルとはwindowsの全てのウインドウに割り当てられる値です。
従ってgselで指定するIDとは別。
WindowFromPointはマウス直下のウインドウハンドルを取得します。
hwndは現在の操作先ウインドウ(gselで指定したウインドウ)のウインドウハンドルを取得します。
つまりWindowFromPointで取得した値とhwndの値を比較して同じなら、
gselでアクティブにすればいいわけです。

#uselib "user32.dll" #cfunc WindowFromPoint "WindowFromPoint" int, int screen 0,500,500 title "1" screen 1,500,500 title "1" screen 2,500,500 title "2" repeat マウス直下のウインドウハンドル=WindowFromPoint(ginfo_mx,ginfo_my) gsel 0 title ""+マウス直下のウインドウハンドル+","+hwnd+"" if マウス直下のウインドウハンドル=hwnd:gsel 0,1 gsel 1 title ""+マウス直下のウインドウハンドル+","+hwnd+"" if マウス直下のウインドウハンドル=hwnd:gsel 1,1 gsel 2 title ""+マウス直下のウインドウハンドル+","+hwnd+"" if マウス直下のウインドウハンドル=hwnd:gsel 2,1 await 10 loop

あとさっき気づいたのですが以前に貼ったソースコードのWindowFromPointの引数にミスがありました。
両方にginfo_mxを指定していますが2つ目のパラメーターはginfo_myでした。



Y_.repeat

リンク

2017/7/4(Tue) 16:42:48|NO.80492

昔、自分も簡単なMAPエディターやって 質問とかしたレスです
ご参考までに

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



しあ

リンク

2017/7/4(Tue) 17:17:38|NO.80493

御二方ともありがとうございます!
ソラさん→何度もありがとうございます、シンプルでわかりやすいです、答えを教えてもらった感じでむずがゆいです笑
y_.repeatさん→昔の参考になりました、重なった時の事も密かに考えてたので助かりました、やっぱり作ってると皆んな通る道なんですかね、
こう言った命令て皆さんどこで知るんですか?
命令 引数 な簡単な命令はわかりますが
戻り値とかハンドルとかそれをもらうhwndとか見慣れないものばかりなので知らないどう調べたらいいかわからないです
自分で作っていますが知らない事が質問が多くてすいません



ソラ(元スペース)

リンク

2017/7/4(Tue) 19:35:35|NO.80494

調べ方というのはプログラミングスキルというより検索スキルの方かと。
winAPIについてはMSDNというマイクロソフトの公式サイトで調べることができます。
https://msdn.microsoft.com/library
(右上の検索ボックスから)

ですが、いちいち開くのは面倒なので私はGoogleで検索してます。
関数の名前をそのまま検索するだけでもMSDNの個別ページ等が出てきますし。

ウインドウハンドルについては以下のページが参考になるかと。
https://msdn.microsoft.com/ja-jp/library/cc344590.aspx
「hsp ウインドウハンドルとは」で検索しても参考になるサイトがいくつかヒットします。



しあ

リンク

2017/7/5(Wed) 02:45:01|NO.80501

すいません、、調べていますがよくわかりません
cとかで使うのを関数と思っていましたが
hspの中にもあったり
宣言?やら手順やらがわからないので
できたら一度手ほどきしていただきです
それが解決したら解決にしようと思います汗



ソラ(元スペース)

リンク

2017/7/5(Wed) 11:01:24|NO.80503

HSPでは戻り値の受け取りが必須な物が関数(ginfo等)、それ以外が命令(mes等)です。
Cでは全て関数です。(多分。Cはよく知らないので詳しい人に任せます)

なので命令・関数の分類はHSPとCでは別に考えましょう。
で、外部DLLの関数を呼び出す手順は、先程も貼りましたが以下のURLが最もわかりやすいかと。
http://www.geocities.co.jp/Playtown-Yoyo/6130/hsp/hsp-win32api.html



Yuuki

リンク

2017/7/5(Wed) 15:39:58|NO.80506

マウスカーソルがどのウィンドウに当たっているか調べる方法〜。

//ウィンドウハンドルからウィンドウIDに変換するモジュール #module "ConvertToWindowID" #uselib "user32.dll" #func GetClassName "GetClassNameA" int,var,int #cfunc GetWindowLong "GetWindowLongA" int,int #define GWL_USERDATA -21 #defcfunc GetWindowIDFromHwnd int p1 sdim class,256 GetClassName p1,class,256 if class!"hspwnd0":return -1////HSPウィンドウ以外のウィンドウの場合 return GetWindowLong(p1,GWL_USERDATA)//ウィンドウハンドルからウィンドウIDに変換 #global #uselib "user32.dll" #func WindowFromPoint "WindowFromPoint" int,int repeat 5 screen cnt title "ウィンドウID "+cnt loop gsel 0,1 repeat wait 1 CursorHwnd=WindowFromPoint(ginfo_mx,ginfo_my) redraw 0 color 255,255,255:boxf color:pos 0,0 //ウィンドウハンドルからウィンドウIDに変換 mes "カーソルに当たっているウィンドウID "+GetWindowIDFromHwnd(CursorHwnd) redraw 1 loop



Cronus

リンク

2017/7/5(Wed) 19:03:10|NO.80507

モジュール化しました。

#module "WindowDecision" //================================================================= // APIや関数の定義 //================================================================= // global指定はしてないので以下のAPI関数はモジュール外では使えない // 使いたいなら #cfuncの後に global を付けて //================================================================= #uselib "user32.dll" #cfunc WindowFromPoint "WindowFromPoint" int, int #cfunc GetAncestor "GetAncestor" int, int //================================================================= // GetMouseWindowDecision命令の戻り値定義 //================================================================= // global指定をしているのでモジュール外も使える //================================================================= // [例] GetMouseWindowDecision wHwnd.cnt //   if stat = GMWD_PER { // end // } //================================================================= #define global GMWD_EDGE 0 #define global GMWD_PER 1 #define global GMWD_ERROR -1 //================================================================= // GetMouseWindowDecision命令 //================================================================= // マウスがウィンドウ内に入っていなかったら戻り値が0になる // マウスがウィンドウ内に入ってたら戻り値が1になる // それ以外は-1になる //================================================================= #deffunc GetMouseWindowDecision int prm1 whwnd = prm1 if GetAncestor(WindowFromPoint(ginfo(0), ginfo(1)), 2) = whwnd { return GMWD_PER } else { return GMWD_EDGE } return GMWD_ERROR /* //================================================================= // GetMouseWindowDecision関数 //================================================================= // マウスがウィンドウ内に入っていなかったら戻り値が0になる // マウスがウィンドウ内に入ってたら戻り値が1になる // それ以外は-1になる //================================================================= #defcfunc GetMouseWindowDecision int prm1 whwnd = prm1 if GetAncestor(WindowFromPoint(ginfo(0), ginfo(1)), 2) = whwnd { return GMWD_PER } else { return GMWD_EDGE } return GMWD_ERROR */ #global winN = 3 ;とりあえず適当にウィンドウの数を3個にする repeat winN ;ウィンドウを作る分hwndを用意 screen cnt ;ウィンドウを作成 wHwnd.cnt = hwnd ;ウィンドウハンドル await 0 loop repeat repeat winN, 0 GetMouseWindowDecision wHwnd.cnt ; マウスがウィンドウ内に入る判定を取得 if stat = GMWD_PER { gsel cnt, 1 ;とりあえずマウスがウィンドウ内に入ったらそのウィンドウを一番手前にする } /* ;<< 関数にしたい場合(ぶっちゃけ俺的には関数の方がいい^^;) >> gmwd = GetMouseWindowDecision(wHwnd.cnt) if gmwd = 1 { gsel cnt, 1 ;とりあえずマウスがウィンドウ内に入ったらそのウィンドウを一番手前にする } */ gsel cnt title "ウィンドウID:" + cnt + " GetMouseWindowDecisionの戻り値:" + stat ;分かりやすくタイトルバーに結果を表示 /* ;<< 関数にしたい場合 >> title "ウィンドウID:" + cnt + " GetMouseWindowDecisionの戻り値:" + gmwd ;分かりやすくタイトルバーに結果を表示 */ loop await 16 loop



ソラ(元スペース)

リンク

2017/7/5(Wed) 19:23:02|NO.80508

>>Yuukiさん
>>Cronusさん
こんなブラックボックスを組み込むよりNO.80488で書いた方法を使ったほうが楽だと思うのですが・・・



Cronus

リンク

2017/7/5(Wed) 21:51:26|NO.80509

なんがグサッってきたw
まぁこれ自分のモジュールにたまたまあった試作品の改良モジュールなんすけどね...



掘木

リンク

2017/7/6(Thu) 21:08:15|NO.80518

oncmdを使う方法もあるよ。

#define global WM_MOUSEMOVE 0x0200 screen 0,240,160,0 oncmd gosub *ev_mousemove,WM_MOUSEMOVE font msgothic,16 screen 1,240,160,0 oncmd gosub *ev_mousemove,WM_MOUSEMOVE font msgothic,16 screen 2,240,160,0 oncmd gosub *ev_mousemove,WM_MOUSEMOVE font msgothic,16 stop *ev_mousemove if ( ginfo_intid != ginfo_sel ) : gsel ginfo_intid,1 if ( ginfo_intid != ginfo_act ) : gsel ginfo_intid,0 pos ((lparam<<16)>>16)-8,(lparam>>16)-8 hsvcolor callcounts\192,255,191 mes "○" callcounts++ return
参考1:MSDN本家WM_MOUSEMOVEの説明
https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms645616(v=vs.85).aspx
参考2:debugウィンドウ使用時に発生する問題
http://hsp.tv/play/pforum.php?mode=pastwch&num=21457



しあ

リンク

2017/7/10(Mon) 05:06:00|NO.80550

皆さんすいません、遅れました
レベルが高すぎて解読が難しいですねCの関数みたいなのを変数に入れてたり
CursorHwndの辺りとか汗
変数の代入しかわからないので、あれ引数2つ入るの?とか
型があるのはわかるけどハンドルみたいなシステム変数を殆どしらないのが理解できない要因ですね
それがあるので毎回MSDN見かけても「?」で終わります

ウィンドウのハンドルはウィンドウ作る時その都度変数にいれてやってみました
難しいと何をしているかよくわからないです汗
位置を比較してるんだなあとかはぼんやりわかりますがものはあるけど道具の使い方がわからないみたいな


oncmdも今別のメニューバーを作っている時に使っていたのですが
なんか表示チェックいれてgselでオンオフするだけが、チェックマーク入るけど
変数で別ウィンドウに行かないようにしてるのに、別ウィンドウにメニューバーが入って
ウィンドウにメニューが入らないようになるとチェックマークが入らないとか
gselとoncmdの流れがわからなく、複数ウィンドウの難しさに苦戦してます

ごちゃごちゃしてすいません、終わるていいながら全く終わりません



しあ

リンク

2017/7/10(Mon) 05:43:04|NO.80551

ごめんなさいgselは解決しました
チェックマークの変数をoncmdの処理のcaceに消すときcaceのなかに
つけるときはさっきのように処理がおかしいので変数べつに作って外でやってたからだめで
両方外にしたらうまくいきました、どちらにせよoncmdがよくわかりません
後メニューバーてせっかくマップチップで揃えたのにウィンドウに侵食する形でウィンドウに食い込むんですね
個別に増えてウィンドウがずれると思ってました
ウィンドウのハンドルの話ですがアイテムというかオブジェクトにも割り振られているらしいですよね
指定ハンドルのサイズをしるにはどうしたらいいんでしょうか
細かくしたくなるとだんだん関数をしらないとできなくなるので避けて通れないですね



ソラ(元スペース)

リンク

2017/7/10(Mon) 09:39:55|NO.80552

オブジェクトのウインドウハンドルはobjinfoで取得できますよ。
oncmdは以下のサイトの解説がわかりやすいかと。
http://lhsp.s206.xrea.com/command/oncmd.html



MillkeySoftw

リンク

2017/7/10(Mon) 10:29:57|NO.80553

ウィンドウハンドルを用いて、ウィンドウのサイズを調べるサンプル


#uselib "user32.dll" #func GetWindowRect "GetWindowRect" int,var /* WinAPIの説明 BOOL WINAPI GetWindowRect( _In_  HWND   hWnd, _Out_ LPRECT lpRect ); _In_ = こちら側から関数に値を与える _Out_ = 関数からの結果 HWND hWnd = ウィンドウハンドル = 数値 ^型 ^名前 'HWND' とは、わかりやすく識別できるようにした型。中身は数値なので HSP だと int です。 LPRECT lpRect = ウィンドウの上下左右の構造体 'LPRECT' とは、RECT 構造体のポインタ型です。先頭に LP がついている物はすべてポインタ(メモリ番地)を指定しなくてはなりません。 [RECT 構造体] : https://msdn.microsoft.com/ja-jp/library/a5ch4fda.aspx typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT; 'LONG' は、int の別名。それが 4 つあるので、4 つ x 4バイトのメモリ。HSP では、int 配列変数(dim)で要素数 4 の変数を作ろう。 で、関数の引数が LP???? として指定されているのでポインタを指定しないといけない。 LP は、ポインタなので、変数のアドレス(ポインタ)を調べなくてはいけない。 HSP で変数のポインタを調べるのに使うのが varptr(変数)である。 今回の場合、スクリプト先頭の #func の引数指定で、var という型を指定している。 この var は、変数のポインタを送れという指示を与えている。 user32.as などで定義されている関数呼び出しは、 #func GetWindowRect "GetWindowRect" int,int になっているので、スクリプト上では下記みたいに命令しなくてはならない。 GetWindowRect hwnd,varptr(RECT) 最初から WinAPI がポインタを要求しているのであれば、var でポインタ指示を出した方が簡単である。 Return value Type: BOOL 'BOOL は、0[FALSE] か 1[TRUE] しかない数値' If the function succeeds, the return value is nonzero. '関数の戻り値が 0 以外[TRUE]なら関数が成功しています。' If the function fails, the return value is zero. To get extended error information, call GetLastError. '関数の戻り値が 0 [FALSE]の場合、関数は失敗しています。詳細な情報は GetLastError を使用して調べてください。' */ //実際に使ってみる dim RECT,4 GetWindowRect hwnd,RECT mes "ウィンドウの左座標.left : "+RECT(0) mes "ウィンドウの上座標.top : "+RECT(1) mes "ウィンドウの右座標.right : "+RECT(2) mes "ウィンドウの下座標.bottom : "+RECT(3) mes "ウィンドウの横サイズ : "+(RECT(2) - RECT(0)) mes "ウィンドウの縦サイズ : "+(RECT(3) - RECT(1))



掘木

リンク

2017/7/10(Mon) 21:11:04|NO.80555

>oncmdも今別のメニューバーを作っている時に使っていたのですが
>なんか表示チェックいれてgselでオンオフするだけが、チェックマーク入るけど
>変数で別ウィンドウに行かないようにしてるのに、別ウィンドウにメニューバーが入って
>ウィンドウにメニューが入らないようになるとチェックマークが入らないとか

>チェックマークの変数をoncmdの処理のcaceに消すときcaceのなかに
>つけるときはさっきのように処理がおかしいので変数べつに作って外でやってたからだめで
>両方外にしたらうまくいきました、どちらにせよoncmdがよくわかりません

文章読む限りで状況が何もわからないのでアドバイスのしようもないのですが…。
なんとなくエスパーな感じで。

oncmd命令で指定したラベルにジャンプした場合に、
ジャンプ先で操作先ウィンドウID(gsel/ginfo_sel)はいくつになっているか確認していますよね?
この値はoncmd命令を実行した時点と同じことを期待していいのは、単一ウィンドウのプログラムだけと思っていいです。



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