|
|
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
|
|
2021/4/2(Fri) 10:49:07|NO.92556
沢渡様
いつも適切なアドバイスありがとうございます。
今回の新しい手法、windowsの基本を知らないので大変参考になりました。
この方法でやってみます。ありがとうございました。
|
|
2021/4/2(Fri) 18:42:16|NO.92559
|
|
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
| |
|
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の仕様なのでしょうかね?
とすると余計な処理せず空欄で事足りる事になります。
とりあえず空欄で進めてみます。
|
|
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改造したくなった時の為に頭の片隅にでも。
|
|
2021/4/4(Sun) 13:41:31|NO.92566
ZAKKI様 あぁそうなのですね、C++は知らないのですが
よくみたら一行がコロンで閉じられているので、今納得しました。
|
|