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

提供: MeryWiki
ナビゲーションに移動 検索に移動
Goat (トーク | 投稿記録)
編集の要約なし
MSY-07 (トーク | 投稿記録)
変数にvarの宣言を追加
 
(2人の利用者による、間の11版が非表示)
1行目: 1行目:
[https://web.archive.org/web/20131010131511/http://www.haijin-boys.com/5087d6882f84b5.80633553.html Mery 2.0.11.3997] で Editors プロパティが追加されたので、この ひな形の存在意義はなくなりました。SFC mini を利用した試行錯誤のサンプルとして見てやってください。


== ■SDI愛好者の方へ ==
== 概要 ==
Mery Ver 2.0.0.3583 以降、SDIモード時にマクロで他の Document へアクセスすることができなくなりました。このため、SDI モードであれば一時的にタブ表示モード  へ変更しマクロ終了後に SDI モードに戻すひな形を作成しました。
<strike>Mery Ver 2.0.0.3583 以降、SDIモード時にマクロで他の Document へアクセスすることができなくなりました。このため、</strike>SDI モードであれば一時的にタブ表示モード  へ変更しマクロ終了後に SDI モードに戻すひな形を作成しました。
ひな形なので投稿のマクロだけでは何も処理しません。実際に利用する場合は、Main 関数に必要なマクロを記述してください。
ひな形なので投稿のマクロだけでは何も処理しません。実際に利用する場合は、Main 関数に必要なマクロを記述してください。


ウィンドウの操作に WIN32API を利用しているため、『SFC mini』をインストールする必要があります。『SFC mini』についての情報は下記のサイトでご確認ください。
== 注意事項 ==
http://sfcmini.sourceforge.jp/help/catid-19.html
ウィンドウの操作に WIN32API を利用しているため、『[https://www.vector.co.jp/soft/winnt/prog/se387565.html SFC mini]』をインストールする必要があります。


Vista 以降の OS をお使いの方は Vector で公開されている正式版 Ver 1.0.1 ではなく sourceforge にある 1.0.5 βをインストールしてください。
== ソースコード ==
http://sourceforge.jp/projects/sfcmini/
<syntaxhighlight lang="javascript" copy>
作者の Katsumi さん blog にてVistaで起きるエラーの状況が書かれています。
(function(){
http://kandk.cafe.coocan.jp/jeans/?itemid=627
  //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(){
   function Main(){
    //MEIDはVer2.0.10.3980時点 変わる可能性大
   //別Documentの操作が必要なマクロをここに書く
    var MEID_WINDOW_ENABLE_TABS = 4236;
  }
    try {
 
      var SfcMiniTools = new ActiveXObject("SfcMini.Tools");
   function SDIToTab(){
      var vcheck = (Number(SfcMiniTools.GetSfcVersion.toString(16)) < 1050);
    //SDIモードかタブ表示モードかを調べる
      var EnumWindows = new ActiveXObject("SfcMini.DynaCall");
    //editor.EnableTabプロパティは Ver.2.0.10.3980 で追加
      var IsWindowVisible = new ActiveXObject("SfcMini.DynaCall");
    var flgSDI = !editor.EnableTab;
      var IsIconic = new ActiveXObject("SfcMini.DynaCall");
    //SDIモードの場合はタブ表示モードに変更
      var ShowWindow = new ActiveXObject("SfcMini.DynaCall");
    if(flgSDI)editor.ExecuteCommandByID(MEID_WINDOW_ENABLE_TABS);
      var SetWindowPos = new ActiveXObject("SfcMini.DynaCall");
    return flgSDI;
      //var MoveWindow = new ActiveXObject("SfcMini.DynaCall");
  }
      var GetWindowText = new ActiveXObject("SfcMini.DynaCall");
 
      var GetWindowRect = new ActiveXObject("SfcMini.DynaCall");
   function BackToSDI(meryWindows){
      EnumWindows.Declare("user32", "EnumWindows");
    //SDIに戻す
      IsWindowVisible.Declare("user32", "IsWindowVisible");
    editor.ExecuteCommandByID(MEID_WINDOW_ENABLE_TABS);
      IsIconic.Declare("user32", "IsIconic");
    //最後の Document が Active になる→WindowTextが変わる→復帰できない
      ShowWindow.Declare("user32", "ShowWindow");
    var flgSaved = (document.saved)?"":" *";
      SetWindowPos.Declare("user32","SetWindowPos") ;
    var docname = (document.name)?document.name:"無題";
      //MoveWindow.Declare("user32", "MoveWindow");
    new ActiveXObject('WScript.Shell').AppActivate(document.name + flgSaved + " - Mery");
      GetWindowText.Declare("user32", "GetWindowTextA");
 
      GetWindowRect.Declare("user32", "GetWindowRect");
    //位置変更後の hWnd 取得
      var SW_MINIMIZE = 6
    try{
      var SW_RESTORE = 9;
      var meryWindowsAfter = getMeryWindows();
      //Windowsの位置を記憶
      for(var i = meryWindows.length; i > 0; i--){
      var meryWindows = getMeryWindows();
        var win = meryWindows[i-1];
    } catch(e) {
        for(var j = 0; j < meryWindowsAfter.length; j++){
      //window.Status = "SFCminiが無いため、APIアクセスができません";
          var winAfter = meryWindowsAfter[j];
      var meryWindows = new Array;
          if(winAfter.name == win.name){
    }
            SetWindowPos(winAfter.hwnd, 0, win.left, win.top, win.width, win.height, 64);
    redraw = false;
            if(win.minimize){
    var SDI = SDIToTab();
              ShowWindow(winAfter.hwnd, SW_MINIMIZE);
    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(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;
             }
             }
            winAfter.name += "再配置済み";
            break;
           }
           }
         }
         }
       }catch(e){}
       }
    }
    }catch(e){}
    
  }
    function getRect(hWnd){
 
      //RECT 構造体
   function getRect(hWnd){
      var lpRect = new ActiveXObject("SfcMini.Structure");
    //RECT 構造体
      lpRect("Left","Long","Top","Long","Right","Long","Bottom","Long");
    var lpRect = new ActiveXObject("SfcMini.Structure");
      GetWindowRect(hWnd, lpRect);
    lpRect("Left","Long","Top","Long","Right","Long","Bottom","Long");
      return lpRect;
    GetWindowRect(hWnd, lpRect);
    }
    return lpRect;
    
  }
    function getMeryWindows(){
 
      var wName = new ActiveXObject("SfcMini.Structure");
   function getMeryWindows(){
      wName("str", "String*256");
    var wName = new ActiveXObject("SfcMini.Structure");
      var mery = new Array;
    wName("str", "String*256");
      var EnumWindowsProc = new Object();
    var mery = new Array;
      EnumWindowsProc.CallBack = function CallBack(hWnd, lParam) {
    var EnumWindowsProc = new Object();
        if (IsWindowVisible(hWnd)) {
    EnumWindowsProc.CallBack = function CallBack(hWnd, lParam) {
          if (GetWindowText(hWnd, wName, 256)) {
      if (IsWindowVisible(hWnd)) {
            if(vcheck){//1.0.1
        if (GetWindowText(hWnd, wName, 256)) {
              var wName2 = wName.str.substring(0, wName.str.indexOf("\0", 0));
          if(vcheck){//1.0.1
            }else{//1.0.5β
            var wName2 = wName.str.substring(0, wName.str.indexOf("\0", 0));
              var wName2 = wName.str.toString();
          }else{//1.0.5β
            }
            var wName2 = wName.str.toString();
            if(wName2.slice(-7) == " - Mery"){
          }
              var win = new Object();
          if(wName2.slice(-7) == " - Mery"){
              win.name = wName2;
            var win = new Object();
              win.hwnd = hWnd;
            win.name = wName2;
              win.minimize = IsIconic(hWnd);
            win.hwnd = hWnd;
              if(win.minimize){
            win.minimize = IsIconic(hWnd);
                ShowWindow(hWnd, SW_RESTORE);
            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;
       }
       }
       EnumWindows(EnumWindows.CallBack(EnumWindowsProc, 2), 0);
       return 1;
      return mery;
    };
    }
    EnumWindows(EnumWindows.CallBack(EnumWindowsProc, 2), 0);
 
    return mery;
  })();
  }
 
})();
</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;
  }

})();
スポンサーリンク