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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0401
darumasan画面最小化したときのginfo(4)と(5)の異常値7解決


darumasan

リンク

2021/4/1(Thu) 12:40:10|NO.92552

下の例で画面を最小化しておき別のscreenで元の画面位置と同じ所に表示したいのですが
最小化するとginfo(4)と(5)が、-32000になり元に戻せません。
最小化した時のginfo(4)(5)は最小化する前の値ではなくなってしまうのは
使用制限なのでしょうか? ご教示お願い致します。

wx=0:wy=0 *start screen 0,800,600,,wx,wy pos 100,100 : mes "「画面1へ」ボタンで5秒後にScreen1に変わる。(不具合再現時は5秒内で最小化しておく)" pos 100,130 : button "画面1へ",*timer_5sec *looping_screen0 wait 10 goto *looping_screen0 *timer_5sec repeat 5 ;最小化しておく場合がある作業フロー wait 100 loop wx=ginfo(4): wy=ginfo(5) ;現在のscreen0の位置を保存 goto *open_screen1 ;作業完了し画面1へ行く *open_screen1 gsel 0,-1 dialog "wx="+wx+" ,wy="+wy,0 screen 1,800,600,,wx,wy ;screen 0と同じ位置に表示させる pos 100,100 : mes "screen 1 表示" pos 100,130 : button "画面0へ",*restart stop *restart gsel 1,-1 goto *start



この記事に返信する


沢渡

リンク

2021/4/1(Thu) 13:22:59|NO.92553

GetWindowPlacementなら通常時の座標を取得できるので、
それでやってみましたがどうでしょうか?

#include "user32.as" dim w_place,11 //WINDOWPLACEMENT構造体 wx=0:wy=0 *start screen 0,800,600,,wx,wy //↓ウィンドウが最小化されているなら元に戻す(不要なら削除してOK) sendmsg hwnd,0x0112,0xF120,0 //WM_SYSCOMMAND=0x0112 SC_RESTORE=0xF120 pos 100,100 : mes "「画面1へ」ボタンで5秒後にScreen1に変わる。(不具合再現時は5秒内で最小化しておく)" pos 100,130 : button "画面1へ",*timer_5sec *looping_screen0 wait 10 goto *looping_screen0 *timer_5sec repeat 5 ;最小化しておく場合がある作業フロー wait 100 loop w_place(0)=44 //構造体のバイト数 GetWindowPlacement hwnd,varptr(w_place) wx=w_place(7) : wy=w_place(8) //通常時の座標を取得 //wx=ginfo(4): wy=ginfo(5) ;現在のscreen0の位置を保存 goto *open_screen1 ;作業完了し画面1へ行く *open_screen1 gsel 0,-1 dialog "wx="+wx+" ,wy="+wy,0 screen 1,800,600,,wx,wy ;screen 0と同じ位置に表示させる pos 100,100 : mes "screen 1 表示" pos 100,130 : button "画面0へ",*restart stop *restart gsel 1,-1 goto *start



darumasan

リンク

2021/4/2(Fri) 10:49:07|NO.92556

沢渡様
いつも適切なアドバイスありがとうございます。
今回の新しい手法、windowsの基本を知らないので大変参考になりました。
この方法でやってみます。ありがとうございました。



zakki

リンク

2021/4/2(Fri) 18:42:16|NO.92559

参考まで。
GetWindowRect()値そのままなのでそういう(Windowsの)仕様ということになるかと。
https://github.com/onitama/OpenHSP/blob/ebaa21deb4650dccfa0a4a6bb86bdc09faa12492/src/hsp3/win32gui/hsp3gr_wingui.cpp#L1564



沢渡

リンク

2021/4/3(Sat) 19:01:06|NO.92560

すみません、修正です。
先に挙げたコードではタスクバーが左や上にある時にタスクバーの幅だけズレてしまいます。
(GetWindowPlacementはタスクバーの幅も考慮した値が返るため)
新しいウィンドウ(ウィンドウ1)は一旦非表示で作成し、
SetWindowPlacementで位置を変更するようにしました。

#include "user32.as" dim w_place,11 //WINDOWPLACEMENT構造体 dim rect,4 //RECT構造体 dim abd,9 //APPBARDATA構造体 wx=0:wy=0 *start screen 0,800,600,,wx,wy //↓ウィンドウが最小化されているなら元に戻す(不要なら削除してOK) sendmsg hwnd,0x0112,0xF120,0 //WM_SYSCOMMAND=0x0112 SC_RESTORE=0xF120 pos 100,100 : mes "「画面1へ」ボタンで5秒後にScreen1に変わる。(不具合再現時は5秒内で最小化しておく)" pos 100,130 : button "画面1へ",*timer_5sec *looping_screen0 wait 10 goto *looping_screen0 *timer_5sec repeat 5 ;最小化しておく場合がある作業フロー wait 100 loop w_place(0)=44 //構造体のバイト数 GetWindowPlacement hwnd,varptr(w_place) wx=w_place(7) : wy=w_place(8) //通常時の座標を取得 //wx=ginfo(4): wy=ginfo(5) ;現在のscreen0の位置を保存 goto *open_screen1 ;作業完了し画面1へ行く *open_screen1 gsel 0,-1 dialog "wx="+wx+" ,wy="+wy,0 screen 1,800,600,2 //非表示で作成 w_place(0)=44 : GetWindowPlacement hwnd,varptr(w_place) //ウィンドウ1の情報取得 w=w_place(9)-w_place(7) : h=w_place(10)-w_place(8) //ウィンドウの横幅と縦幅 w_place(0)=44,0,9 //w_place(2)に9(SW_RESTORE)を指定しているので、SetWindowPlacement実行とともに表示される w_place(7)=wx,wy,wx+w,wy+h //ウィンドウの表示座標を指定 SetWindowPlacement hwnd,varptr(w_place) pos 100,100 : mes "screen 1 表示" pos 100,130 : button "画面0へ",*restart stop *restart gsel 1,-1 goto *start



darumasan

リンク

2021/4/4(Sun) 11:22:52|NO.92564

沢渡様
タスクバー位置による修正版ありがとうございます。

ZAKKI 様
提示頂いたcodingをそのまま実行しようとすると次のエラーがでます。
#HSP script preprocessor Ver3.5 / onion.....
#Use file [hspdef.as]
#Error:invalid include suffix inline7 [(program name)]
#重大なエラーが検出されています

多分そのまま実行するものではないcoding sampleか、私のhsp環境が適合してない為かと
思いますが、私のレベルではとても解釈できる内容ではありませんので猫に小判かも、です。

話を元に戻しますが、screenのp5,p6を指定しなくても(空欄)、私の確認では
移動していた同じ位置に再表示されてくることが確認できました。
そうすると毎回通常時位置を保存、取得しなくても問題なく表示動作します。
screenのp5,6空欄でも元の(最新の)位置に表示してくるのはwindowsの仕様なのでしょうかね? 
とすると余計な処理せず空欄で事足りる事になります。
とりあえず空欄で進めてみます。



zakki

リンク

2021/4/4(Sun) 12:14:16|NO.92565

ginfo(4)を実行したときにhspが(hsp3.exeが)どうやって値を返しているかっていうC++のソースコードなのでhsedで使うものではありません。
とりあえずWin32 APIのGetWindowRectが-32000を返してて、そういうWindowsの仕様だと把握するための証拠くらいの話です。
Windows API呼びたくなったりhsp3.exe改造したくなった時の為に頭の片隅にでも。



darumasan

リンク

2021/4/4(Sun) 13:41:31|NO.92566

ZAKKI様 あぁそうなのですね、C++は知らないのですが
よくみたら一行がコロンで閉じられているので、今納得しました。



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