「SDIウィンドウの記憶と復帰」の版間の差分
ナビゲーションに移動
検索に移動
編集の要約なし |
編集の要約なし |
||
| 9行目: | 9行目: | ||
Vista 以降の OS をお使いの方は Vector で公開されている正式版 Ver 1.0.1 ではなく sourceforge にある 1.0.5 βをインストールしてください。 | Vista 以降の OS をお使いの方は Vector で公開されている正式版 Ver 1.0.1 ではなく sourceforge にある 1.0.5 βをインストールしてください。 | ||
http://sourceforge.jp/projects/sfcmini/ | http://sourceforge.jp/projects/sfcmini/ | ||
作者の Katsumi さん blog にてVistaで起きるエラーの状況が書かれています。 | 作者の Katsumi さん blog にてVistaで起きるエラーの状況が書かれています。 | ||
http://kandk.cafe.coocan.jp/jeans/?itemid=627 | http://kandk.cafe.coocan.jp/jeans/?itemid=627 | ||
2012年9月17日 (月) 00:13時点における版
■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;
}
})();
スポンサーリンク