last updated:2023/12/27
全ての場合についてできるわけではないですが、whileループかなんかで処理をするような場合については「秀まるおのマクロサーバ」や「田楽DLL」を使って以下の様な感じで何とかなるんじゃないでしょうか?
以下の例では、"0"〜"9"の文字を繰り返し1000個まで表示させます。「中止」ボタンをクリックすると処理を中断します。
「秀まるおのマクロサーバ」を使った場合
// マクロサーバで常にダイアログを表示させるサンプル
run "macserv.exe";
ddeinitiate "HideMacroServer", "AllService";
ddepoke "newdialog", "20,秀丸マクロ";
ddepoke "newcontrol", "text,,処理中です";
ddepoke "newcontrol", "defbutton,,中止";
ddepoke "notify", "10";
$item = "";
ddestartadvice "dlgresult", $item;
ddeexecute "dialog lastactiveparent";
while( 1 ){
ddewaitadvice $item, 10;
// 「中止」ボタンが押されたら終了する
if( $item != "" ) break;
// 元々のコード例:ここから
// 終わったら break でループを抜ける
#n = #n + 1;
#m = #m + 1;
if (#n > 9) #n = 0;
insert str(#n);
if (#m > 1000) break;
// 元々のコード例:ここまで
}
ddeexecute "enddialog";
ddestopadvice "dlgresult";
ddeexecute "exit";
endmacro;
// (ここまで)-----------------------------------------------
「田楽DLL」を使った場合
// 田楽DLLで常にダイアログを表示させるサンプル
loaddll "dengakudll.dll";
if(!result){
message "DLLのロードに失敗しました。";
endmacro;
}
if(dllfunc("NEWDIALOG", "秀丸マクロ", 20) == 0 ||
dllfunc("NEWCONTROL","text", "", "処理中です") == 0 ||
dllfunc("NEWCONTROL","defbutton", "btn1", "中止") == 0 ||
dllfunc("SETCTRLNOTIFY","btn1", "10") == 0){
message "ダイアログ作成エラー!";freedll;endmacro;
}
if (!dllfunc("SHOWDIALOG",hidemaruhandle(0),1)){
freedll;
message "ダイアログの表示に失敗しました。";
endmacro;
}
$item = "";
// 「中止」ボタンが押されたら終了する
while (strlen($item) == 0){
$item = dllfuncstr("WAITCTRLNOTIFY",10);
if( $item != "" ) break;
// 元々のコード例:ここから
// 終わったら break でループを抜ける
#n = #n + 1;
#m = #m + 1;
if (#n > 9) #n = 0;
insert str(#n);
if (#m > 1000) break;
// 元々のコード例:ここまで
}
#ret = dllfunc("ENDDIALOG");
freedll;
endmacro;
// (ここまで)-----------------------------------------------