秀丸マクロでコマンドプロンプトを操作するには
追記
2バイト文字をコマンドプロンプトに送る方法についてはこちらで解決したので参考にしてみてください。
秀丸でコマンドプロンプトの操作 - tomoemonの日記
追記ここまで
これまで秀丸のマクロを使いたいと思ったことが一度も無かったのですが、昨日なぜか突然「python ファイル名」とコマンドプロンプトで打つのが面倒になったのでマクロを書いてみました。問題点がいろいろあるのですが、まずコマンドプロンプトに2バイト文字列を送る方法がわかりません。SendMessageで、WM_KEYDOWN、WM_CHAR、WM_KEYUPを送っているのですが、これでは2バイト文字は送ることができません。しかも、たまに変な風に文字列が送信されてしまうし・・・。クリップボードが使えるので、クリップボードから貼り付けようかとも思いましたが、Ctrl+Vが使えないのでうまくいきませんでした。
問題点の2つ目はすでに存在するコマンドプロンプトをアクティブにすることができないことです。WM_ACTIVATEを送ったりしてみましたが、WM_ACTIVATEは「アクティブにする」メッセージではなく、「アクティブになったことをウィンドウに知らせる」メッセージなので意味がありませんでしたorzしかたがないのでこんなツールを入れてみることにしました。
ACTIVATE for Windowsの詳細情報 : Vector ソフトを探す!
それにしても「callされてないのにreturnしています」というエラーには驚かされました。callされていないんだったら、その文は実行されるはずが無いじゃないかと思ったのですが、このマクロにおける関数は別の実行空間になっているのではなく、単純に「そこにそういう名前のラベル付けがされている」だけの存在なんですね。一番下まで律儀に実行してしまったら、それは確かにcallされてないのにreturnしてしまいますよね。
if(filename == "")
{
SAVEAS;
}
save;
$python = "python " + basename;
$command = "cmd.exe /k " + $python;
$cmd = "C:\\WINDOWS\\system32\\cmd.exe";
$cdcmd = "cd " + directory;
$activate = macrodir + "\\activate";
#window = findwindow($cmd);
if(#window != 0)
{
// カレントディレクトリの2バイト文字列チェック
call CheckDoubleByte $cdcmd;
if(##return != 0)
{
message("ディレクトリ名に2バイト文字が含まれているため実行できません");
endmacro;
}
// カレントディレクトリの移動
call SendCommand $cdcmd,#window;
// コマンドプロンプトのアクティブ化
call SendCommand $activate,#window;
// Python実行命令の2バイト文字列チェック
call CheckDoubleByte $python;
if(##return != 0)
{
message("ファイル名に2バイト文字が含まれているため実行できません");
endmacro;
}
// Pythonの実行
call SendCommand $python,#window;
}
else
{
run $command;
}
endmacro;
CheckDoubleByte:
##len = strlen($$1);
##i = 0;
while(##i < ##len)
{
if((ascii(midstr($$1, ##i, 2)) & 0xff00) != 0)
{
return 1;
}
##i = ##i + 1;
}
return 0;
SendCommand:
##len = strlen($$1);
##i = 0;
while(##i < ##len)
{
##sendchar = ascii(midstr($$1, ##i, 1));
##res = sendmessage(##2, 0x0100, ##sendchar, 0); // WM_KEYDOWN
##res = sendmessage(##2, 0x0102, ##sendchar, 0); // WM_CHAR
##res = sendmessage(##2, 0x0101, ##sendchar, 0); // WM_KEYUP
##i = ##i + 1;
}
// 改行キーの送信
##res = sendmessage(##2, 0x0100, 0x0D, 0); // WM_KEYDOWN
##res = sendmessage(##2, 0x0102, 0x0D, 0); // WM_CHAR
##res = sendmessage(##2, 0x0101, 0x0D, 0); // WM_KEYUP
return;