|
|
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でした。
|
|
2017/7/4(Tue) 16:42:48|NO.80492
|
|
2017/7/4(Tue) 17:17:38|NO.80493
御二方ともありがとうございます!
ソラさん→何度もありがとうございます、シンプルでわかりやすいです、答えを教えてもらった感じでむずがゆいです笑
y_.repeatさん→昔の参考になりました、重なった時の事も密かに考えてたので助かりました、やっぱり作ってると皆んな通る道なんですかね、
こう言った命令て皆さんどこで知るんですか?
命令 引数 な簡単な命令はわかりますが
戻り値とかハンドルとかそれをもらうhwndとか見慣れないものばかりなので知らないどう調べたらいいかわからないです
自分で作っていますが知らない事が質問が多くてすいません
|
|
2017/7/5(Wed) 02:45:01|NO.80501
すいません、、調べていますがよくわかりません
cとかで使うのを関数と思っていましたが
hspの中にもあったり
宣言?やら手順やらがわからないので
できたら一度手ほどきしていただきです
それが解決したら解決にしようと思います汗
|
|
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
|
|
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で書いた方法を使ったほうが楽だと思うのですが・・・
|
|
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) 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命令を実行した時点と同じことを期待していいのは、単一ウィンドウのプログラムだけと思っていいです。
|
|