「SDIウィンドウの記憶と復帰」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
ページの作成:「(function(){ //MEIDはVer2.0.8.3919時点 変わる可能性大 var MEID_WINDOW_ENABLE_TABS = 4236; try { var SfcMiniTools = new ActiveXObject("SfcMini.Tools"...」
 
編集の要約なし
1行目: 1行目:
(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(){
== ■SDI愛好者の方へ ==
//別Documentの操作が必要なマクロをここに書く
Mery Ver 2.0.0.3583 以降、SDIモード時にマクロで他の Document へアクセスすることができなくなりました。このため、SDI モードであれば一時的にタブ表示モード  へ変更しマクロ終了後に SDI モードに戻すひな形を作成しました。
  }
ひな形なので投稿のマクロだけでは何も処理しません。実際に利用する場合は、Main 関数に必要なマクロを記述してください。


  function SDIToTab(){
ウィンドウの操作に WIN32API を利用しているため、『SFC mini』をインストールする必要があります。『SFC mini』についての情報は下記のサイトでご確認ください。
    //SDIモードかタブ表示モードかを調べる
http://sfcmini.sourceforge.jp/help/catid-19.html
    if(editor.documents.count == 1){
 
      editor.NewFile();
Vista 以降の OS をお使いの方は Vector で公開されている正式版 Ver 1.0.1 ではなく sourceforge にある 1.0.5 βをインストールしてください。
      var flgSDI = (editor.documents.count == 1);
http://sourceforge.jp/projects/sfcmini/
      //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){
作者の Katsumi さん blog にてVistaで起きるエラーの状況が書かれています。
    //SDIに戻す
http://kandk.cafe.coocan.jp/jeans/?itemid=627
    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 取得
  (function(){
     try{
     //MEIDはVer2.0.8.3919時点 変わる可能性大
       var meryWindowsAfter = getMeryWindows();
    var MEID_WINDOW_ENABLE_TABS = 4236;
       for(var i = meryWindows.length; i > 0; i--){
     try {
        var win = meryWindows[i-1];
       var SfcMiniTools = new ActiveXObject("SfcMini.Tools");
        for(j = 0; j < meryWindowsAfter.length; j++){
       var vcheck = (Number(SfcMiniTools.GetSfcVersion.toString(16)) < 1050);
          var winAfter = meryWindowsAfter[j];
      var EnumWindows = new ActiveXObject("SfcMini.DynaCall");
          if(winAfter.name == win.name){
      var IsWindowVisible = new ActiveXObject("SfcMini.DynaCall");
            SetWindowPos(winAfter.hwnd, 0, win.left, win.top, win.width, win.height, 64);
      var IsIconic = new ActiveXObject("SfcMini.DynaCall");
            if(win.minimize){
      var ShowWindow = new ActiveXObject("SfcMini.DynaCall");
              ShowWindow(winAfter.hwnd, SW_MINIMIZE);
      var SetWindowPos = new ActiveXObject("SfcMini.DynaCall");
            }
      //var MoveWindow = new ActiveXObject("SfcMini.DynaCall");
            winAfter.name += "再配置済み";
      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;
       }
       }
     }catch(e){}
     }
  }
 
 
    function BackToSDI(meryWindows){
  function getRect(hWnd){
      //SDIに戻す
    //RECT 構造体
      editor.ExecuteCommandByID(MEID_WINDOW_ENABLE_TABS);
    var lpRect = new ActiveXObject("SfcMini.Structure");
      //最後の Document が Active になる→WindowTextが変わる→復帰できない
    lpRect("Left","Long","Top","Long","Right","Long","Bottom","Long");
      var flgSaved = (document.saved)?"":" *";
    GetWindowRect(hWnd, lpRect);
      var docname = (document.name)?document.name:"無題";
    return lpRect;
      new ActiveXObject('WScript.Shell').AppActivate(document.name + flgSaved + " - Mery");
   }
    
 
      //位置変更後の hWnd 取得
  function getMeryWindows(){
      try{
    var wName = new ActiveXObject("SfcMini.Structure");
        var meryWindowsAfter = getMeryWindows();
    wName("str", "String*256");
        for(var i = meryWindows.length; i > 0; i--){
    var mery = new Array;
          var win = meryWindows[i-1];
    var EnumWindowsProc = new Object();
          for(j = 0; j < meryWindowsAfter.length; j++){
    EnumWindowsProc.CallBack = function CallBack(hWnd, lParam) {
            var winAfter = meryWindowsAfter[j];
      if (IsWindowVisible(hWnd)) {
            if(winAfter.name == win.name){
        if (GetWindowText(hWnd, wName, 256)) {
              SetWindowPos(winAfter.hwnd, 0, win.left, win.top, win.width, win.height, 64);
          if(vcheck){//1.0.1
              if(win.minimize){
            var wName2 = wName.str.substring(0, wName.str.indexOf("\0", 0));
                ShowWindow(winAfter.hwnd, SW_MINIMIZE);
          }else{//1.0.5β
              }
             var wName2 = wName.str.toString();
              winAfter.name += "再配置済み";
              break;
             }
           }
           }
           if(wName2.slice(-7) == " - Mery"){
        }
            var win = new Object();
      }catch(e){}
            win.name = wName2;
    }
            win.hwnd = hWnd;
 
            win.minimize = IsIconic(hWnd);
    function getRect(hWnd){
            if(win.minimize){
      //RECT 構造体
              ShowWindow(hWnd, SW_RESTORE);
      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);
             }
             }
            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 1;
      EnumWindows(EnumWindows.CallBack(EnumWindowsProc, 2), 0);
       return mery;
     }
     }
    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;
   }
 
 })();
スポンサーリンク