SDIウィンドウの記憶と復帰
ナビゲーションに移動
検索に移動
Mery 2.0.11.3997 で Editors プロパティが追加されたので、この ひな形の存在意義はなくなりました。SFC mini を利用した試行錯誤のサンプルとして見てやってください。
概要[編集]
Mery Ver 2.0.0.3583 以降、SDIモード時にマクロで他の Document へアクセスすることができなくなりました。このため、SDI モードであれば一時的にタブ表示モード へ変更しマクロ終了後に SDI モードに戻すひな形を作成しました。
ひな形なので投稿のマクロだけでは何も処理しません。実際に利用する場合は、Main 関数に必要なマクロを記述してください。
注意事項[編集]
ウィンドウの操作に WIN32API を利用しているため、『SFC mini』をインストールする必要があります。
ソースコード[編集]
(function(){
//MEIDはVer2.0.10.3980時点 変わる可能性大
var MEID_WINDOW_ENABLE_TABS = 4236;
try {
var SfcMiniTools = new ActiveXObject("SfcMini.Tools");
var vcheck = (Number(SfcMiniTools.GetSfcVersion.toString(16)) < 1050);
var EnumWindows = new ActiveXObject("SfcMini.DynaCall");
var IsWindowVisible = new ActiveXObject("SfcMini.DynaCall");
var IsIconic = new ActiveXObject("SfcMini.DynaCall");
var ShowWindow = new ActiveXObject("SfcMini.DynaCall");
var SetWindowPos = new ActiveXObject("SfcMini.DynaCall");
//var MoveWindow = new ActiveXObject("SfcMini.DynaCall");
var GetWindowText = new ActiveXObject("SfcMini.DynaCall");
var GetWindowRect = new ActiveXObject("SfcMini.DynaCall");
EnumWindows.Declare("user32", "EnumWindows");
IsWindowVisible.Declare("user32", "IsWindowVisible");
IsIconic.Declare("user32", "IsIconic");
ShowWindow.Declare("user32", "ShowWindow");
SetWindowPos.Declare("user32","SetWindowPos") ;
//MoveWindow.Declare("user32", "MoveWindow");
GetWindowText.Declare("user32", "GetWindowTextA");
GetWindowRect.Declare("user32", "GetWindowRect");
var SW_MINIMIZE = 6;
var SW_RESTORE = 9;
//Windowsの位置を記憶
var meryWindows = getMeryWindows();
} catch(e) {
//window.Status = "SFCminiが無いため、APIアクセスができません";
var meryWindows = new Array;
}
redraw = false;
var SDI = SDIToTab();
Main();
if(SDI)BackToSDI(meryWindows);
redraw = true;
Quit();
function Main(){
//別Documentの操作が必要なマクロをここに書く
}
function SDIToTab(){
//SDIモードかタブ表示モードかを調べる
//editor.EnableTabプロパティは Ver.2.0.10.3980 で追加
var flgSDI = !editor.EnableTab;
//SDIモードの場合はタブ表示モードに変更
if(flgSDI)editor.ExecuteCommandByID(MEID_WINDOW_ENABLE_TABS);
return flgSDI;
}
function BackToSDI(meryWindows){
//SDIに戻す
editor.ExecuteCommandByID(MEID_WINDOW_ENABLE_TABS);
//最後の Document が Active になる→WindowTextが変わる→復帰できない
var flgSaved = (document.saved)?"":" *";
var docname = (document.name)?document.name:"無題";
new ActiveXObject('WScript.Shell').AppActivate(document.name + flgSaved + " - Mery");
//位置変更後の hWnd 取得
try{
var meryWindowsAfter = getMeryWindows();
for(var i = meryWindows.length; i > 0; i--){
var win = meryWindows[i-1];
for(var j = 0; j < meryWindowsAfter.length; j++){
var winAfter = meryWindowsAfter[j];
if(winAfter.name == win.name){
SetWindowPos(winAfter.hwnd, 0, win.left, win.top, win.width, win.height, 64);
if(win.minimize){
ShowWindow(winAfter.hwnd, SW_MINIMIZE);
}
winAfter.name += "再配置済み";
break;
}
}
}
}catch(e){}
}
function getRect(hWnd){
//RECT 構造体
var lpRect = new ActiveXObject("SfcMini.Structure");
lpRect("Left","Long","Top","Long","Right","Long","Bottom","Long");
GetWindowRect(hWnd, lpRect);
return lpRect;
}
function getMeryWindows(){
var wName = new ActiveXObject("SfcMini.Structure");
wName("str", "String*256");
var mery = new Array;
var EnumWindowsProc = new Object();
EnumWindowsProc.CallBack = function CallBack(hWnd, lParam) {
if (IsWindowVisible(hWnd)) {
if (GetWindowText(hWnd, wName, 256)) {
if(vcheck){//1.0.1
var wName2 = wName.str.substring(0, wName.str.indexOf("\0", 0));
}else{//1.0.5β
var wName2 = wName.str.toString();
}
if(wName2.slice(-7) == " - Mery"){
var win = new Object();
win.name = wName2;
win.hwnd = hWnd;
win.minimize = IsIconic(hWnd);
if(win.minimize){
ShowWindow(hWnd, SW_RESTORE);
}
var rect = getRect(hWnd);
win.left = rect.Left;
win.top = rect.Top;
win.width = rect.Right - rect.Left;
win.height = rect.Bottom - rect.Top;
mery.push(win);
}
}
}
return 1;
};
EnumWindows(EnumWindows.CallBack(EnumWindowsProc, 2), 0);
return mery;
}
})();
スポンサーリンク