SDIウィンドウの記憶と復帰

2012年9月16日 (日) 23:54時点における210.164.54.67 (トーク)による版 (ページの作成:「(function(){ //MEIDはVer2.0.8.3919時点 変わる可能性大 var MEID_WINDOW_ENABLE_TABS = 4236; try { var SfcMiniTools = new ActiveXObject("SfcMini.Tools"...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

(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;
 }

})();

スポンサーリンク