「SDIウィンドウの記憶と復帰」の版間の差分
ナビゲーションに移動
検索に移動
ページの作成:「(function(){ //MEIDはVer2.0.8.3919時点 変わる可能性大 var MEID_WINDOW_ENABLE_TABS = 4236; try { var SfcMiniTools = new ActiveXObject("SfcMini.Tools"...」 |
変数にvarの宣言を追加 |
||
| (3人の利用者による、間の14版が非表示) | |||
| 1行目: | 1行目: | ||
[https://web.archive.org/web/20131010131511/http://www.haijin-boys.com/5087d6882f84b5.80633553.html Mery 2.0.11.3997] で Editors プロパティが追加されたので、この ひな形の存在意義はなくなりました。SFC mini を利用した試行錯誤のサンプルとして見てやってください。 | |||
== 概要 == | |||
<strike>Mery Ver 2.0.0.3583 以降、SDIモード時にマクロで他の Document へアクセスすることができなくなりました。このため、</strike>SDI モードであれば一時的にタブ表示モード へ変更しマクロ終了後に SDI モードに戻すひな形を作成しました。 | |||
ひな形なので投稿のマクロだけでは何も処理しません。実際に利用する場合は、Main 関数に必要なマクロを記述してください。 | |||
== 注意事項 == | |||
ウィンドウの操作に WIN32API を利用しているため、『[https://www.vector.co.jp/soft/winnt/prog/se387565.html SFC mini]』をインストールする必要があります。 | |||
== ソースコード == | |||
<syntaxhighlight lang="javascript" copy> | |||
(function(){ | (function(){ | ||
//MEIDはVer2.0. | //MEIDはVer2.0.10.3980時点 変わる可能性大 | ||
var MEID_WINDOW_ENABLE_TABS = 4236; | var MEID_WINDOW_ENABLE_TABS = 4236; | ||
try { | try { | ||
| 21行目: | 32行目: | ||
GetWindowText.Declare("user32", "GetWindowTextA"); | GetWindowText.Declare("user32", "GetWindowTextA"); | ||
GetWindowRect.Declare("user32", "GetWindowRect"); | GetWindowRect.Declare("user32", "GetWindowRect"); | ||
var SW_MINIMIZE = 6 | var SW_MINIMIZE = 6; | ||
var SW_RESTORE = 9; | var SW_RESTORE = 9; | ||
//Windowsの位置を記憶 | //Windowsの位置を記憶 | ||
| 37行目: | 48行目: | ||
function Main(){ | function Main(){ | ||
//別Documentの操作が必要なマクロをここに書く | |||
} | } | ||
function SDIToTab(){ | function SDIToTab(){ | ||
//SDIモードかタブ表示モードかを調べる | //SDIモードかタブ表示モードかを調べる | ||
//editor.EnableTabプロパティは Ver.2.0.10.3980 で追加 | |||
var flgSDI = !editor.EnableTab; | |||
//SDIモードの場合はタブ表示モードに変更 | |||
if(flgSDI)editor.ExecuteCommandByID(MEID_WINDOW_ENABLE_TABS); | |||
return flgSDI; | |||
} | } | ||
| 76行目: | 73行目: | ||
for(var i = meryWindows.length; i > 0; i--){ | for(var i = meryWindows.length; i > 0; i--){ | ||
var win = meryWindows[i-1]; | var win = meryWindows[i-1]; | ||
for(j = 0; j < meryWindowsAfter.length; j++){ | for(var j = 0; j < meryWindowsAfter.length; j++){ | ||
var winAfter = meryWindowsAfter[j]; | var winAfter = meryWindowsAfter[j]; | ||
if(winAfter.name == win.name){ | if(winAfter.name == win.name){ | ||
| 130行目: | 127行目: | ||
} | } | ||
return 1; | return 1; | ||
} | }; | ||
EnumWindows(EnumWindows.CallBack(EnumWindowsProc, 2), 0); | EnumWindows(EnumWindows.CallBack(EnumWindowsProc, 2), 0); | ||
return mery; | return mery; | ||
| 136行目: | 133行目: | ||
})(); | })(); | ||
</syntaxhighlight> | |||
2025年11月24日 (月) 17:20時点における最新版
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;
}
})();
スポンサーリンク