- 作成者投稿
- 2008年8月12日 1:25 pm #6409Aye Wongメンバー
現在、ポップアップメニューで他のアプリも含めたウィンドウを一覧表示し、選ばれたものと、現在のエディタのフレームウィンドウを左右もしくは上下に2つ並べるというマクロを書こうとしています。
しかし、shell.windowsにはあってタスクバーに出てこないようなウィンドウも膨大にあり、適切な選択肢を示すことができません。
SDKだと、ウィンドウスタイルや、拡張ウィンドウスタイルを判定するようですが、マクロではどのようにすればいいでしょうか?
2008年8月12日 6:23 pm #6410Yutaka EmuraキーマスターAye Wongさんは書きました:
現在、ポップアップメニューで他のアプリも含めたウィンドウを一覧表示し、選ばれたものと、現在のエディタのフレームウィンドウを左右もしくは上下に2つ並べるというマクロを書こうとしています。しかし、shell.windowsにはあってタスクバーに出てこないようなウィンドウも膨大にあり、適切な選択肢を示すことができません。
SDKだと、ウィンドウスタイルや、拡張ウィンドウスタイルを判定するようですが、マクロではどのようにすればいいでしょうか?
Window オブジェクトの Visible プロパティを使用すると、ウィンドウが表示されている状態かどうかを判別することができます。ヘルプには書いていなかったので追加します。
http://jp.emeditor.com/help/macro/window/visible.htm
ご指摘ありがとうございます。
2008年8月12日 8:41 pm #6413Aye WongメンバーYutakaさんは書きました:
Window オブジェクトの Visible プロパティを使用すると、ウィンドウが表示されている状態かどうかを判別することができます。ヘルプには書いていなかったので追加します。ありがとうございます。教えていただいたVisibleを使ってみましたが、まだ関係ないウィンドウが表示されるようです。コードは下のようになりますがどうしたらいいでしょうか?
#title=もう一つのウィンドウと並べて表示
function ShowMenu(menuDef)
{
function Array2Menu(a, commands)
{
var menu = CreatePopupMenu();
for (var i = 0 ; i < a.length ; ++i)
{
if ((a.submenu != null) && a.submenu instanceof Array) {
var submenu = Array2Menu(a.submenu, commands);
menu.AddPopup(a.label, submenu);
} else {
var index = commands.length;
if (index == 0) {
index = 1;
}
if (a.label == “—-“) {
menu.Add(“”, 0, eeMenuSeparator);
} else {
var flags = (a.checked ? eeMenuChecked : 0) | (a.grayed ? eeMenuGrayed : 0);
menu.Add(a.label, index, flags);
commands[index] = a;
}
}
}
return menu;
}
var commands = [];
var menu = Array2Menu(menuDef, commands);
var commandIndex = menu.Track(/*eePosMouse*/);
if (commandIndex > 0) {
commands[commandIndex].command();
return true;
}
return false;
}function getDesktopSize()
{
var html = new ActiveXObject(“htmlfile”);
return {width:(html.Script.screen.width), height:(html.Script.screen.height)};
}desktop = getDesktopSize();
function TileHorizontally(w1, w2)
{
w1.SetPosition(0, 0, desktop.width, desktop.height/2);
w2.SetPosition(0, desktop.height/2, desktop.width, desktop.height/2);
w1.SetForeground();
w2.SetForeground();
}function TileVertically(w1, w2)
{
w1.SetPosition(0, 0, desktop.width/2, desktop.height);
w2.SetPosition(desktop.width/2, 0, desktop.width/2, desktop.height);
w1.SetForeground();
w2.SetForeground();
}function genMenuDef()
{
var result = [];
for (var i = 1 ; i < shell.windows.Count ; ++i)
{
var w = shell.windows.Item(i);
if (!w.Valid) continue;
if (!w.Visible) continue;
result.push(
{label:w.Caption, submenu:[
{label:"とウィンドウを縦に並べる", w1:w, w2:this, command: function() {TileHorizontally(this.w1, this.w2)}},
{label:"とウィンドウを横に並べる", w1:w, w2:this, command: function() {TileVertically(this.w1, this.w2)}}
]}
);
}
return result;
}ShowMenu(genMenuDef());
2008年8月12日 10:12 pm #6414Yutaka Emuraキーマスターw.ClassName で、クラス名を取得できるので、それで既知の不要なウィンドウがあったらメニューに入れないようにすることができます。たとえば、ClassName が “SideBar_HTMLHostWindow” だったら、サイドバーのガジェットになるので、これは除くことができます。
2008年8月13日 12:45 pm #6420Aye Wongメンバーなるほど、ClassNameですか、このマクロのために、膨大なウィンドウクラス名のデータを集めて持つのはちょっと馬鹿げているかと思いますので、ここは正攻法で、EmEditorマクロのWindowオブジェクトにStyleプロパティ、ExStyleプロパティを追加していただけるとよいのですが…どうぞよろしくお願いします。
2008年8月13日 9:50 pm #6423Yutaka EmuraキーマスターAye Wongさんは書きました:
なるほど、ClassNameですか、このマクロのために、膨大なウィンドウクラス名のデータを集めて持つのはちょっと馬鹿げているかと思いますので、ここは正攻法で、EmEditorマクロのWindowオブジェクトにStyleプロパティ、ExStyleプロパティを追加していただけるとよいのですが…どうぞよろしくお願いします。Alpha 8 より、Style, ExStyle プロパティも追加しました。
2008年8月15日 9:11 pm #6431Aye WongメンバーYutakaさんは書きました:
Alpha 8 より、Style, ExStyle プロパティも追加しました。ありがとうございます。よろしくお願いいたします。
2008年8月28日 1:37 pm #6443Aye Wongメンバー遅くなりましたが、7.50 alpha 8 で追加された API でこのマクロを動かすことができました。 ありがとうございます。7.50 正式版がでたら公開したいと思います。
ところで、これらのプロパティへの値の代入はできないでしょうか?できるとまたいろいろ面白いマクロが組めるのですが…
- 作成者投稿
- このトピックに返信するにはログインしてください。