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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0821
きのよーEnableWindowを使った時の挙動について2解決


きのよー

リンク

2014/8/21(Thu) 01:59:13|NO.64097

Kpanさんのサイトで見たEnableWindowを使ってウィンドウの有効無効を切り替えているのですが、
有効にした直後、Explorerの裏側に隠れてしまうことがあります。
これを回避させたいのですが、方法がわかりません。
どのようにしたらよいか教えていただきたいです。

・備考
>>input a,"ジャンプ先の番号を入れてください","0","たいとる"
というコマンドに対し

┌────────────────┐ │たいとる            │ ├────────────────┤ │ジャンプ先の番号を入れてください│ │                │ │                │ │[0             ]│←第3パラメータが初期値 │[キャンセル]     「OK]│ └────────────────┘
のようなウィンドウを表示して、
・OKを押された場合、aに入力内容を代入、システム変数statに0を代入
・キャンセルを押された場合、aに入力内容を代入、システム変数statに-1を代入
という処理を行うプログラムです。


*func_input sbuf=exstr(param(1)) sbuf1=exstr(param(2)) sbuf2=exstr(param(3)) //param(0)→第一パラメータ //param(1)→第二パラメータ //のように解析済みなので変数にそのまま代入 if sbuf2!"":sbuf2+=" - " //タイトルが入力されていた場合はその後に文字列を加えるのでハイフンを追加 EnableWindow mwindowhwnd,0 EnableWindow consschwnd,0 //ここで、メインウィンドウとデバッグ用コンソールウィンドウ(?)を無効にする if inputflag(0)=0{ //まだinput用ウィンドウが作られていない場合 screen ginfo(25),400,230,2 inputflag(1)=ginfo(3) syscolor 15 boxf pos 10,10 winobj "static", "", , $50000000,380,150 inputflag(2)=objinfo(stat,2) GetStockObject 17 //確かフォント指定 sendmsg inputflag(2), $30, stat //確かフォント指定 inputflag(0)=1 //ウィンドウを作ったので objsize 150,30 pos 90,190 button "キャンセル",*func_input3 pos 240,190 button "OK",*func_input2 //ボタンを付ける } gsel inputflag(1) //作ったウィンドウに描画先を指定 sendmsg inputflag(2),$c,,sbuf //スタティックテキスト書き換え pos 10,160 input sbuf1,380,22,1024 //入力ボックス buf=stat //消すときのために title sbuf2+"noh Projector" //タイトルの指定 gsel inputflag(1),1 //ウィンドウの表示 onexit goto *func_input3 //閉じるボタンはキャンセル判定 stop *func_input2 statsub=0 //システム変数statの実体 goto *func_input4 *func_input3 statsub=-1 //構造上stat変数を書き換えることができるので毎回定義し直すために goto *func_input4 *func_input4 varrest(varin(param(0)))=sbuf1 //変数の実体に文字列を代入、変数名や命令名は適当、。 log_add "\ninput question:"+sbuf+" stat:"+statbuf+" input:"+sbuf1 //コンソール(?)に出力 onexit goto *allexit //閉じるボタンの挙動を元に戻す gsel inputflag(1),-1 //入力ウィンドウ非表示 clrobj buf,buf //入力ボックスを消す gsel 0,1 //メインウィンドウをアクティブにする EnableWindow consschwnd,1 //コンソールウィンドウを有効化 EnableWindow mwindowhwnd,1 //メインウィンドウを有効化 SetActiveWindow mwindowhwnd //念押しにメインウィンドウをアクティブにする goto *funcend
もちろんこれ単体では何も動きませんが、
これを実行した後、Explorerの裏側にメインウィンドウが隠れてしまうことがあります。
そのようなコードはどこにも書いてないはずなのですが……。
原因と対処方法を知っている人がいましたら、ご教授お願いします。



この記事に返信する


掘木

リンク

2014/8/21(Thu) 08:53:51|NO.64102

提示されたコードを実行する方法が分からない。。。

Explorerの裏に隠れるのが、
EnableWindowによる動作なのか、提示されたコードで起こる事なのかがいまいち分からない。

少なくともうちの環境では検出できない。。。(以下テストコード)

#uselib "user32.dll" #func EnableWindow "EnableWindow" int,int #define FALSE 0 #define TRUE 1 screen 0 hwndlist(0) = hwnd button gosub "open",*open screen 1,240,180,screen_tool|screen_hide hwndlist(1) = hwnd button gosub "OK",*done_ok stop *open EnableWindow hwndlist(0) , FALSE gsel 1,2 return *done_ok EnableWindow hwndlist(0) , TRUE gsel 1,-1 gsel 0,1 return 0



きのよー

リンク

2014/8/21(Thu) 19:41:18|NO.64131

ご回答有難うございます。

堀木さん

>>提示されたコードを実行する方法が分からない。。。
そ、そうですよね……。ごめんなさい。
ただ、Explorerの裏に隠すような処理を行っていないことを提示したかっただけです。
もうちょっと考慮してから投稿するべきでした。ごめんなさい。

>>少なくともうちの環境では検出できない。。。(以下テストコード)
テストコードと手持ちのソースを見比べて気づき、堀木さんのテストコードの19,20行目を入れ替え、
ウィンドウを有効にする前にツールウィンドウを非表示にしました。
この結果、1回ではありますがExplorerの裏にID0ウィンドウが隠れる事が起こり、
まれにExplorerのタイトルバーがフラッシュする(一瞬だけアクティブになる?)こともありました。
裏付けとして、手持ちのコードでメインウィンドウが無効状態でインプット用ウィンドウを最小化した時、
その後ろにあるメインウィンドウではなく、その後ろのExplorerがアクティブになり、
メインウィンドウより前に出てきました。
堀木さんのテストコードでID1からツールウィンドウモードを外し、
ID0が無効状態でID1を最小化してもらうと再現できます。

……つまり、無効状態のウィンドウより有効状態のウィンドウのほうが前に出てきてしまうため、
HSPのウィンドウがすべて無効状態になる瞬間を作らないようにすればよい、ということでした。

非常に単純な結論でしたが、気づかせてくださった堀木さんに感謝します……。
ありがとうございました。



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