2016年11月29日火曜日

前回終了時のウィンドウの位置とサイズを復元するHTA

終了直前のウィンドウサイズと位置をファイルに記録して、次回起動時にそのファイルを読み込んで元のサイズ・位置に戻すサンプルを作成しました。




ソース
<html>
<script>
onload = function(){
// windowの位置、サイズについてmoveToとscreenTop(Left)のズレなどの取得は
// windowが閉じる直前のタイミングでやろうとすると、最小化状態から終了された場合に正しい値が取得できない。
// 起動時にズレを取得しておき、リサイズ時に位置とサイズを逐一記録する。(本当は移動時にも記録したいが、onmoveのようなメソッドをHTAはサポートしていない
window位置保存()
onresize = function(){ window位置保存() }
path = fs.GetFolder('.').path + '/pos.txt'
if(fs.FileExists(path)){eval(Read(path))}
}
window位置保存 = function(){
var w=window, doc=document, cW='clientWidth', cH='clientHeight'
var getObj=function(){return {L:w.screenLeft||w.screenX||0, T:w.screenTop||w.screenY||0, W:w.innerWidth||doc.body[cW]||doc.documentElement[cW]||0, H:w.innerHeight||doc.body[cH]||doc.documentElement[cH]||0}}
var L=400, T=400, W=400, H=400
moveTo(L,T)
resizeTo(W,H)
var obj0 = getObj()
window位置保存=function(){
var obj=getObj()
obj.L += L - obj0.L
obj.T += T - obj0.T
obj.W += W - obj0.W
obj.H += H - obj0.H
Write(path, 'moveTo('+obj.L+'<screen.width ? '+obj.L+' : 0,'+obj.T+'<screen.height ? '+obj.T+' : 0);resizeTo('+obj.W+','+obj.H+');')
}
}
fs = new ActiveXObject('Scripting.FileSystemObject')
Read = function(p){var o=fs.OpenTextFile(p), s=o.AtEndOfStream?'':o.ReadAll(); o.Close(); return s}
Write = function(path,v){ with(fs.CreateTextFile(path)){Write(v);return Close()} }
</script>
</html>



単純にscreenTopなどを記録するだけだと微妙にズレるので、任意の値(今回のサンプルでは全項目:400)を設定する前後の値を比較して、ズレを考慮した処理になるようにしています。

モニタの解像度が変わるなどの理由で、moveToで指定した座標に移動させるとモニタにウィンドウが表示されないような状況になった場合は(0, 0)に移動するようにしました。

0 件のコメント:

コメントを投稿