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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0815
ゆうやん㋿最大化について15解決


ゆうやん㋿

リンク

2019/8/15(Thu) 13:25:35|NO.88050

HSPの最大化についてなんですが、ディスプレイの設定で縦にすると、なぜか最大化されません。
どうすればいいのでしょうか?

#uselib "user32.dll" #func global GetWindowLong "GetWindowLongA" sptr,sptr #func global SetWindowLong "SetWindowLongA" sptr,sptr,sptr screen 0,ginfo(20), ginfo(21),2,,,640,480 GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat | $10000 | $40000 gsel 0,1



この記事に返信する


ham

リンク

2019/8/15(Thu) 14:02:38|NO.88051

screen 0,ginfo(20), ginfo(21)
で最大の大きさが決まっちゃうので...

最初から大きめにしておけば一応最大化はできると思いますが
メモリを無駄に喰うのが一つ難点?



WM_DISPLAYCHANGEで解像度の変更を検知して、もう一度screenするか、
どうするかは作者さん次第ですかね。

#define WM_DISPLAYCHANGE $007E
oncmd gosub *chg,WM_DISPLAYCHANGE



ゆうやん ㋿

リンク

2019/8/28(Wed) 22:10:31|NO.88245

>NO.88051
マルチモニターでサブモニターの方だと最大化ボタンを押しても、最大化してくれないので、oncmdとscreenだけでは ダメかなと思うのですが…。



ham

リンク

2019/8/28(Wed) 22:21:00|NO.88246

マルチモニターに対応させるならまた話は変わってきますね。
ginfoではメインの方の解像度しか取得できないので、こちらのモジュールが役立つかと。
http://hsp.tv/play/pforum.php?mode=pastwch&num=66937



ham

リンク

2019/8/28(Wed) 22:40:12|NO.88248

ついこの前自分用に作った、普通に配列変数に入れるだけのサンプル
他人から見た見やすさとかは皆無ですが。


ret = GMIinit(8) GMIcnt dispmax = stat ;ディスプレイの数 repeat dispmax ret=GMIrect(cnt,disp):if ret=0:dialog"ディスプレイ"+cnt+"の解像度を取得できませんでした。" dispx(cnt)=disp(0):dispy(cnt)=disp(1) : dispsizex(cnt)=disp(2)-disp(0):dispsizey(cnt)=disp(3)-disp(1) ;ディスプレイの位置、サイズ代入 loop



ham

リンク

2019/8/29(Thu) 10:07:39|NO.88255

「dim disp,4」が抜けてました。もし↑のを使うなら最初の方に入れといてください。



ゆうやん ㋿

リンク

2019/9/1(Sun) 22:03:50|NO.88290

こんな感じでいいのでしょうか?

;モジュール省略 #uselib "user32.dll" #func GetWindowLong "GetWindowLongA" int,int #func SetWindowLong "SetWindowLongA" int,int,int #func MessageBox "MessageBoxA" int,int,int,int #packopt hide 1;一瞬だけウィンドウが生成されないようにする。 #define WM_DISPLAYCHANGE $007E oncmd gosub *chgwindow,WM_DISPLAYCHANGE gosub *chgwindow stop *chgwindow dim disp,4 ret = GMIinit(8) GMIcnt dispmax = stat ;ディスプレイの数 repeat dispmax ret=GMIrect(cnt,disp):if ret=0:MessageBox 0,"ディスプレイ("+cnt+")の解像度の取得に失敗しました。\n終了します。","エラー",16:end dispx_pos(cnt)=disp(0):dispy_pos(cnt)=disp(1) : dispsizex(cnt)=disp(2)-disp(0):dispsizey(cnt)=disp(3)-disp(1) ;ディスプレイの位置、サイズ代入 dispx=dispx+dispsizex;横長ウィンドウも出せるようにしてみる。 dispy=dispy+dispsizey;縦長ウィンドウも出せるようにしてみる。 loop screen 0,dispx,dispy,2,,,640,480 GetWindowLong hwnd,-16 SetWindowLong hwnd,-16,stat|$10000|$40000 gsel 0,1 return
あと、サブモニターに全画面表示にしたい場合、こんな感じでもいいのでしょうか?

;モジュール省略 #uselib "user32.dll" #func MessageBox "MessageBoxA" int,int,int,int #define WM_DISPLAYCHANGE $007E oncmd gosub *chgwindow,WM_DISPLAYCHANGE gosub *chgwindow stop *chgwindow dim disp,4 ret = GMIinit(8) GMIcnt dispmax = stat ;ディスプレイの数 monitor=0;全画面表示するモニター(0がメインモニター) repeat dispmax ret=GMIrect(cnt,disp):if ret=0:MessageBox 0,"ディスプレイ("+cnt+")の解像度の取得に失敗しました。\n終了します。","エラー",16:end dispx_pos(cnt)=disp(0):dispy_pos(cnt)=disp(1) : dispsizex(cnt)=disp(2)-disp(0):dispsizey(cnt)=disp(3)-disp(1) ;ディスプレイの位置、サイズ代入 loop bgscr 0,dispsizex(monitor),dispsizey(monitor),,dispx_pos(monitor),dispy_pos(monitor) return
使っているPCはノートパソコンなので、今、テレビにつないでないため確認ができませんが。



ham

リンク

2019/9/2(Mon) 09:07:54|NO.88294

大体あってると思いますよ。
サブモニターの方はmonitor=1にしないとメインになっちゃいますね。
コメントに書いてあるので多分分かっていて間違えただけかと思いますが。

この部分は必要なさそうな気もしたけどどうかな

dispx=dispx+dispsizex;横長ウィンドウも出せるようにしてみる。 dispy=dispy+dispsizey;縦長ウィンドウも出せるようにしてみる。

実際に試さないとミスに気が付かないっていうのは結構あるので、
見ただけで完璧かどうかの判断は難しい...



ゆうやん ㋿

リンク

2019/9/2(Mon) 12:39:03|NO.88297

>この部分は必要なさそうな気もしたけどどうかな
メモ帳など、他のソフトでは、横長や縦長ウィンドウを出せるため、一応、出せるようにしてみました。
cntを入れるの忘れてました。

dispx=dispx+dispsizex(cnt);横長ウィンドウも出せるようにしてみる。 dispy=dispy+dispsizey(cnt);縦長ウィンドウも出せるようにしてみる。
テレビにつないで試してみたところ、正常に動いたので、解決にしておきます。
ありがとうございました。



ゆうやん ㋿

リンク

2019/9/2(Mon) 13:06:12|NO.88298

スクリプトに誤りがありました。


#func MessageBox "MessageBoxA" int,int,int,int


#func MessageBox "MessageBoxA" int,str,str,int



ゆうやん ㋿

リンク

2019/9/2(Mon) 13:23:58|NO.88301

解決したのにすみません。
これをhsp3utfで使うと強制終了されるんですけど、どうにかならないのでしょうか?



ham

リンク

2019/9/2(Mon) 14:43:13|NO.88302

hsp3utfとマルチディスプレイ取得使うと何のエラーも表示されずに落ちますね...
hsp3.6のベータだとutfインクルードしなくても落ちるんですけど、関連性があるのだろうか?
誰か分かる方いたら自分も教えて欲しい・・・



おにたま(管理人)

リンク

2019/9/2(Mon) 21:45:07|NO.88310

元のモジュールで使用されているEnumDisplayMonitorsのコールバックがDEP(データ実行防止)にかかっているため落ちてしまうようです。
以下のようにVirtualProtectを追加すると3.5以降、hsp3utfでも動作するかと思います。

#module #uselib "user32.dll" #cfunc EnumDisplayMonitors "EnumDisplayMonitors" sptr, sptr, sptr, int #func GetMonitorInfo "GetMonitorInfoA" sptr, sptr #uselib "kernel32.dll" #func VirtualProtect "VirtualProtect" int,int,int,var #define FALSE 0 #define TRUE 1 #define NULL 0 #define MaxMonitors 16 #define MaxRectParameters 4 #define MaxParameters 5 #define Prm_API 0 #define Prm_max 1 #define Prm_cnt 2 #define Prm_idx_primary 3 #define Prm_ptr_rects 4 // 初期化 ret = GMIinit( 最大値 ); // 最大値は数えるディスプレイの最大数。1以上MaxMonitors以下の値。 // 成功ならretは0以外の値、失敗なら0。 #defcfunc GMIinit int max; if ( (max < 1) || (max > MaxMonitors) ) { return FALSE; } dim prm, (MaxParameters + 1); dim rects, ((max + 1) * MaxRectParameters); dim bin, (23 + 1); dim a_stat mref a_stat, 64; bin( 0) = 0x83ec8b55, 0x5653d8c4, 0x145d8b57, 0x28d845c7, 0x8d000000; bin( 5) = 0x8b50d845, 0xff520855, 0x75c08513, 0xebc03304, 0xfc558b2e; bin(10) = 0x7501fa83, 0x084b8b06, 0x8b0c4b89, 0x538b0843, 0x04e0c110; bin(15) = 0x8b104d8b, 0x0004b9f1, 0x3c8d0000, 0x0001b802, 0xa5f30000; bin(20) = 0x5f0843ff, 0xe58b5b5e, 0x0010C25D; prm(Prm_API) = varptr(GetMonitorInfo); prm(Prm_max) = max; prm(Prm_cnt) = 0; prm(Prm_idx_primary) = 0; prm(Prm_ptr_rects) = varptr(rects); old=0 VirtualProtect varptr(bin),24*4,$40,old ; メモリプロテクトの設定 ret = EnumDisplayMonitors(NULL, NULL, varptr(bin), varptr(prm)); return ret; // ディスプレイの数を取得しstatに格納。失敗は負数。 #deffunc GMIcnt if (ret == FALSE) { a_stat = -1; } else { a_stat = prm(Prm_cnt); } return; // プライマリー・ディスプレイのインデックスを取得しstatに格納。失敗は負数。 #deffunc GMIprimary if (ret == FALSE) { a_stat = -1; } else { a_stat = prm(Prm_idx_primary); } return; // 指定したディスプレイの、仮想画面内の座標を取得。 // ret = GMIrect(idx, rect); // 成功 : retは0以外。rectに座標を格納。 // rect(0) : 左上X座標, rect(1) : 左上Y座標, // rect(2) : 右下X座標, rect(3) : 右下Y座標 // 失敗 : retは0。 rectは不定。 #defcfunc GMIrect int idx, array rect if ( (ret == FALSE) || (idx < 0) || (idx >= prm(Prm_cnt)) ) { return FALSE; } work = idx * MaxRectParameters; rect(0) = rects(work + 0); rect(1) = rects(work + 1); rect(2) = rects(work + 2); rect(3) = rects(work + 3); return TRUE; // 後始末 #deffunc GMIclear dim prm, 1; dim rects, 1; dim bin, 1; ret = FALSE; return; #global ret = GMIinit(4) if ret != 0{ GMIcnt discnt = stat if discnt != -1{ GMIprimary dispri = stat dim dispostemp,4 dim disinfo,discnt,6 dim disinfo2,8 repeat discnt dim dispostemp,4 if GMIrect(cnt,dispostemp) = 0:discnt = -1:break disinfo(cnt,0) = dispostemp(0) //poslx プライマリーディスプレイから見たn番目のディスプレイの左上x座標 disinfo(cnt,1) = dispostemp(1) //posly プライマリーディスプレイから見たn番目のディスプレイの左上y座標 disinfo(cnt,2) = dispostemp(2) //posrx プライマリーディスプレイから見たn番目のディスプレイの右下x座標 disinfo(cnt,3) = dispostemp(3) //posrx プライマリーディスプレイから見たn番目のディスプレイの右下y座標 disinfo(cnt,4) = dispostemp(2)-dispostemp(0) //n番目のディスプレイの幅 disinfo(cnt,5) = dispostemp(3)-dispostemp(1) //n番目のディスプレイの高さ loop repeat discnt if disinfo2(0) >= disinfo(cnt,0):disinfo2(0) = disinfo(cnt,0) //個々のディスプレイで一番小さいx座標 if disinfo2(1) >= disinfo(cnt,1):disinfo2(1) = disinfo(cnt,1) //個々のディスプレイで一番小さいy座標 if disinfo2(2) <= disinfo(cnt,2):disinfo2(2) = disinfo(cnt,2) //個々のディスプレイで一番大きいx座標 if disinfo2(3) <= disinfo(cnt,3):disinfo2(3) = disinfo(cnt,3) //個々のディスプレイで一番大きいy座標 loop disinfo2(4) = -1 * (0 - disinfo2(0)) //ディスプレイ全体の最左座標 disinfo2(5) = -1 * (0 - disinfo2(1)) //ディスプレイ全体の最上座標 disinfo2(6) = abs(disinfo2(0)) + abs(disinfo2(2)) //ディスプレイ全体の横幅 disinfo2(7) = abs(disinfo2(1)) + abs(disinfo2(3)) //ディスプレイ全体の縦幅 } } else { dialog "初期化失敗" end } GMIclear sdim message,1024 message += strf("%d枚のディスプレイがあります\n",discnt) message += strf("プライマリーディスプレイは%d枚目です\n\n",dispri) repeat discnt message += strf("%d枚目のディスプレイの情報\n",cnt) message += strf("\t左上座標(%4d,%4d)",disinfo(cnt,0),disinfo(cnt,1)) message += strf(" 右下座標(%4d,%4d)",disinfo(cnt,2),disinfo(cnt,3)) message += strf(" 幅%4dpx,高さ%4dpx\n",disinfo(cnt,4),disinfo(cnt,5)) loop mesbox message,640,480 stop



ham

リンク

2019/9/2(Mon) 22:38:22|NO.88311

奥が深いですね..DEPとかそういうのが影響することもあるんですね。
VirtualProtectを追加したところhsp3utfでもちゃんと動くようになりました!
地味に困っていたのでかなり助かりました!おにたまさんありがとうございます。



ゆうやん ㋿

リンク

2019/9/3(Tue) 23:55:03|NO.88318

おにたまさん。ありがとうございます。
 hsp3utfで実行するとエラーメッセージが表示されず、強制終了されてしまうのはDEPが原因だったんですね。
 Unicodeが原因か わかりませんが、hsp3utfで実行すると なぜか落ちちゃうんですよね。不思議です。
 一応ですが、「GetMonitorInfoA」だと、ANSI(Shift-JIS)扱いになってしまうので、「GetMonitorInfoW」に変えてみました。


#include "hsp3utf.as" #module #uselib "user32.dll" #cfunc EnumDisplayMonitors "EnumDisplayMonitors" wptr,wptr,wptr,int #func GetMonitorInfo "GetMonitorInfoW" wptr,wptr #uselib "kernel32.dll" #func VirtualProtect "VirtualProtect" int,int,int,var #define FALSE 0 #define TRUE 1 #define NULL 0 #define MaxMonitors 16 #define MaxRectParameters 4 #define MaxParameters 5 #define Prm_API 0 #define Prm_max 1 #define Prm_cnt 2 #define Prm_idx_primary 3 #define Prm_ptr_rects 4 #defcfunc GMIinit int max if ( (max < 1) || (max > MaxMonitors) ) { return FALSE } dim prm, (MaxParameters + 1) dim rects, ((max + 1) * MaxRectParameters) dim bin, (23 + 1) dim a_stat mref a_stat, 64 bin( 0) = 0x83ec8b55,0x5653d8c4,0x145d8b57,0x28d845c7,0x8d000000 bin( 5) = 0x8b50d845,0xff520855,0x75c08513,0xebc03304,0xfc558b2e bin(10) = 0x7501fa83,0x084b8b06,0x8b0c4b89,0x538b0843,0x04e0c110 bin(15) = 0x8b104d8b,0x0004b9f1,0x3c8d0000,0x0001b802,0xa5f30000 bin(20) = 0x5f0843ff,0xe58b5b5e,0x0010C25D prm(Prm_API) = varptr(GetMonitorInfo) prm(Prm_max) = max prm(Prm_cnt) = 0 prm(Prm_idx_primary) = 0 prm(Prm_ptr_rects) = varptr(rects) old=0 VirtualProtect varptr(bin),24*4,$40,old ret = EnumDisplayMonitors(NULL, NULL, varptr(bin), varptr(prm)) return ret #deffunc GMIcnt if (ret == FALSE) { a_stat = -1 } else { a_stat = prm(Prm_cnt) } return #deffunc GMIprimary if (ret == FALSE) { a_stat = -1 } else { a_stat = prm(Prm_idx_primary) } return #defcfunc GMIrect int idx, array rect if ( (ret == FALSE) || (idx < 0) || (idx >= prm(Prm_cnt)) ) { return FALSE } work = idx * MaxRectParameters rect(0) = rects(work + 0) rect(1) = rects(work + 1) rect(2) = rects(work + 2) rect(3) = rects(work + 3) return TRUE #deffunc GMIclear dim prm, 1 dim rects, 1 dim bin, 1 ret = FALSE return #global #uselib "user32.dll" #func GetWindowLong "GetWindowLongW" int,int #func SetWindowLong "SetWindowLongW" int,int,int #func MessageBox "MessageBoxW" int,wstr,wstr,int #packopt hide 1;一瞬だけウィンドウが生成されないようにする。 #define WM_DISPLAYCHANGE $007E oncmd gosub *chgwindow,WM_DISPLAYCHANGE gosub *chgwindow stop *chgwindow dim disp,4 ret = GMIinit(8) GMIcnt dispmax = stat ;ディスプレイの数 repeat dispmax ret=GMIrect(cnt,disp):if ret=0:MessageBox 0,"ディスプレイ("+cnt+")の解像度の取得に失敗しました。\n終了します。","エラー",16:end /*disp_posx(cnt)=disp(0):disp_posy(cnt)=disp(1):*/dispsizex(cnt)=disp(2)-disp(0):dispsizey(cnt)=disp(3)-disp(1) ;ディスプレイの位置、サイズ代入 dispx=dispx+dispsizex(cnt);横長ウィンドウも出せるようにしてみる。 dispy=dispy+dispsizey(cnt);縦長ウィンドウも出せるようにしてみる。 loop screen 0,dispx,dispy,2,,,640,480 GetWindowLong hwnd,-16 SetWindowLong hwnd,-16,stat|$10000|$40000 gsel 0,1 return
ついでに、マルチモニターの全画面のスクリプトも載せておきます。

;モジュール省略 #uselib "user32.dll" #func MessageBox "MessageBoxW" int,wstr,wstr,int #define WM_DISPLAYCHANGE $007E oncmd gosub *chgwindow,WM_DISPLAYCHANGE gosub *chgwindow stop *chgwindow dim disp,4 ret = GMIinit(8) GMIcnt dispmax = stat ;ディスプレイの数 monitor=0;全画面表示するモニター(0がメインモニター) repeat dispmax ret=GMIrect(cnt,disp):if ret=0:MessageBox 0,"ディスプレイ("+cnt+")の解像度の取得に失敗しました。\n終了します。","エラー",16:end disp_posx(cnt)=disp(0):disp_posy(cnt)=disp(1) : dispsizex(cnt)=disp(2)-disp(0):dispsizey(cnt)=disp(3)-disp(1) ;ディスプレイの位置、サイズ代入 loop bgscr 0,dispsizex(monitor),dispsizey(monitor),,disp_posx(monitor),disp_posy(monitor) return



ゆうやん㋿

リンク

2019/9/8(Sun) 09:16:38|NO.88361

あと、hsp3_64(UTF-8版)で実行したら、強制終了されるんですけど、64bitに対応していないのでしょうか?
DEPが原因なのは多分わかるんですが・・・。



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