「SDIウィンドウの記憶と復帰」の版間の差分
ナビゲーションに移動
検索に移動
ページの作成:「(function(){ //MEIDはVer2.0.8.3919時点 変わる可能性大 var MEID_WINDOW_ENABLE_TABS = 4236; try { var SfcMiniTools = new ActiveXObject("SfcMini.Tools"...」 |
編集の要約なし |
||
| 1行目: | 1行目: | ||
== ■SDI愛好者の方へ == | |||
Mery Ver 2.0.0.3583 以降、SDIモード時にマクロで他の Document へアクセスすることができなくなりました。このため、SDI モードであれば一時的にタブ表示モード へ変更しマクロ終了後に SDI モードに戻すひな形を作成しました。 | |||
ひな形なので投稿のマクロだけでは何も処理しません。実際に利用する場合は、Main 関数に必要なマクロを記述してください。 | |||
ウィンドウの操作に WIN32API を利用しているため、『SFC mini』をインストールする必要があります。『SFC mini』についての情報は下記のサイトでご確認ください。 | |||
http://sfcmini.sourceforge.jp/help/catid-19.html | |||
Vista 以降の OS をお使いの方は Vector で公開されている正式版 Ver 1.0.1 ではなく sourceforge にある 1.0.5 βをインストールしてください。 | |||
http://sourceforge.jp/projects/sfcmini/ | |||
作者の Katsumi さん blog にてVistaで起きるエラーの状況が書かれています。 | |||
http://kandk.cafe.coocan.jp/jeans/?itemid=627 | |||
// | (function(){ | ||
try{ | //MEIDはVer2.0.8.3919時点 変わる可能性大 | ||
var | 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モードかタブ表示モードかを調べる | |||
if(editor.documents.count == 1){ | |||
editor.NewFile(); | |||
var flgSDI = (editor.documents.count == 1); | |||
//SDIモードの場合はタブ表示モードに変更 | |||
if(flgSDI)editor.ExecuteCommandByID(MEID_WINDOW_ENABLE_TABS); | |||
//ダミーの新規ファイルを閉じる | |||
var docs = editor.documents; | |||
var docindex = docs.count; | |||
for(var i = 0 ; i < docindex ; i++){ | |||
var objdoc = docs.item(i); | |||
if(objdoc.name == "" && objdoc.saved && !objdoc.text){ | |||
objdoc.close(); | |||
break; | break; | ||
} | } | ||
} | } | ||
return flgSDI; | |||
} else { | |||
return false; | |||
} | } | ||
} | } | ||
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(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; | |||
} | |||
} | } | ||
if(wName2.slice(-7) == " - Mery"){ | } | ||
}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; | |||
} | } | ||
return | EnumWindows(EnumWindows.CallBack(EnumWindowsProc, 2), 0); | ||
return mery; | |||
} | } | ||
})(); | |||
})(); | |||
2012年9月17日 (月) 00:12時点における版
■SDI愛好者の方へ
Mery Ver 2.0.0.3583 以降、SDIモード時にマクロで他の Document へアクセスすることができなくなりました。このため、SDI モードであれば一時的にタブ表示モード へ変更しマクロ終了後に SDI モードに戻すひな形を作成しました。 ひな形なので投稿のマクロだけでは何も処理しません。実際に利用する場合は、Main 関数に必要なマクロを記述してください。
ウィンドウの操作に WIN32API を利用しているため、『SFC mini』をインストールする必要があります。『SFC mini』についての情報は下記のサイトでご確認ください。 http://sfcmini.sourceforge.jp/help/catid-19.html
Vista 以降の OS をお使いの方は Vector で公開されている正式版 Ver 1.0.1 ではなく sourceforge にある 1.0.5 βをインストールしてください。 http://sourceforge.jp/projects/sfcmini/
作者の Katsumi さん blog にてVistaで起きるエラーの状況が書かれています。 http://kandk.cafe.coocan.jp/jeans/?itemid=627
(function(){
//MEIDはVer2.0.8.3919時点 変わる可能性大
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モードかタブ表示モードかを調べる
if(editor.documents.count == 1){
editor.NewFile();
var flgSDI = (editor.documents.count == 1);
//SDIモードの場合はタブ表示モードに変更
if(flgSDI)editor.ExecuteCommandByID(MEID_WINDOW_ENABLE_TABS);
//ダミーの新規ファイルを閉じる
var docs = editor.documents;
var docindex = docs.count;
for(var i = 0 ; i < docindex ; i++){
var objdoc = docs.item(i);
if(objdoc.name == "" && objdoc.saved && !objdoc.text){
objdoc.close();
break;
}
}
return flgSDI;
} else {
return false;
}
}
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(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;
}
})();
スポンサーリンク