置換ダイアログをマクロで操作できますかNo.10514
popper さん 25/01/17 19:51
 
マクロ(replacedialog)で置換ダイアログを開いたとき、
カーソルは検索語にフォーカスされていますが、
置換語にフォーカスされた状態(さらにできれば、置換語の先頭・2文字目・末端な
どにカーソルが位置する状態)で開きたいのですが、
マクロでそういったことが可能でしょうか?

よろしくお願いいたします。

[ ]
RE:10514 置換ダイアログをマクロで操作でNo.10515
igus さん 25/01/18 00:30
 
UWSCという自動化ツールがあるのですがこれを使えば秀丸とかにキーコードを送った
りできるのでマクロと組み合わせて使っています。
置換のダイアログを開いて ALT+E で置換語にフォーカスしたい場合はこんな感じです。

//置換.mac
$st=getselectedtext();
if($st=="")$st="hoge";

$uwsc="C:/Program Files (x86)/uwsc/uwsc.exe";
run $uwsc+" "+currentmacrodirectory+"\\alte.uws";
replacedialog $st ,$st;
endmacro;

//alte.uws
sleep(0.05)
ACW(GETID("秀丸","Hidemaru32Class"))
ACW(GETID("置換","#32770"))
KBD(VK_ALT,DOWN,50)
KBD(VK_E,CLICK,50)
KBD(VK_ALT,UP,50)

[ ]
RE:10515 置換ダイアログをマクロで操作でNo.10516
popper さん 25/01/18 13:45
 
igus さん、すばやいご回答ありがとうございます。

「UWSC」というのは初めて知りました。
秀丸の使い方が広がりそうです。勉強してみます。

取り急ぎお礼申し上げます。


[ ]
RE:10516 置換ダイアログをマクロで操作でNo.10517
秀まるお2 さん 25/01/20 10:30
 
タブキーを1回押すだけなので、とりあえず秀丸メールに付属の「tkinfo.dll」の、
「Bypass_keybd_event」って使うやり方も可能です。

秀丸メールもインストールされてる前提のマクロにはなりますけども。

サンプルマクロ:

    if( (platform & 0x00080000) != 0 ) {
        loaddll @"c:\program files\hidemarumail\tkinfo.dll";
    } else {
        loaddll @"c:\program files (x86)\hidemarumail\tkinfo.dll";
    }
    #n = dllfunc("Bypass_keybd_event", 0x09 );
    replacedialog "aaa", "bbb";

[ ]
RE:10517 置換ダイアログをマクロで操作でNo.10518
popper さん 25/01/23 00:33
 
秀まるお2 さん、ありがとうございます。
ご教授の方法でもやってみます。

もう1つお尋ねしたいことがあります。

置換ダイアログが開いたとき、
「下検索」ボタンにフォーカスされているのですが、
「全置換」にフォーカスされるようにすることも可能でしょうか?

可能でしたらどうすればよいか教えていただけるでしょうか。
よろしくお願いいたします。

[ ]
RE:10518 置換ダイアログをマクロで操作でNo.10519
秀まるお2 さん 25/01/23 11:55
 
全置換ボタンにフォーカス移動するにはTabキーを何回も押す必要があって、さらに
「あいまい検索」や「選択した範囲」などが灰色になってるとそこがスキップされる
ことも計算しないといけなくて、ちょっと大変です。

とりあえずの作戦として、Shift+Tabキーを3回押せば、逆方向から「全置換」ボタ
ンに移動できるので、その作戦がいいんじゃないかと思いました。秀丸メールの最新
版だと「Bypass_keybd_event_raw」って関数が追加されてるので、それを使えば一応
できると思います。

例:

    if( (platform & 0x00080000) != 0 ) {
        loaddll @"c:\program files\hidemarumail\tkinfo.dll";
    } else {
        loaddll @"c:\program files (x86)\hidemarumail\tkinfo.dll";
    }
    #n = dllfunc("Bypass_keybd_event_raw", 0x10, 0x2A, 0, 0 );
    #n = dllfunc("Bypass_keybd_event_raw", 0x09, 0x0F, 0, 0 );
    #n = dllfunc("Bypass_keybd_event_raw", 0x09, 0x0F, 2, 0 );
    #n = dllfunc("Bypass_keybd_event_raw", 0x09, 0x0F, 0, 0 );
    #n = dllfunc("Bypass_keybd_event_raw", 0x09, 0x0F, 2, 0 );
    #n = dllfunc("Bypass_keybd_event_raw", 0x09, 0x0F, 0, 0 );
    #n = dllfunc("Bypass_keybd_event_raw", 0x09, 0x0F, 2, 0 );
    #n = dllfunc("Bypass_keybd_event_raw", 0x10, 0x2A, 2, 0 );
    replacedialog "aaa", "bbb";

ちなみにC++言語で書くとこんな風になります。それを無理矢理秀丸マクロにした形
です。

//VK_SHIFT 0x10
//VK_TAB   0x09
//VK_SHIFTのスキャンコード = 0x2A
//VK_TABのスキャンコード = 0x0F
//KEYEVENTF_KEYUP       0x0002

    keybd_event( VK_SHIFT, 0x2A, 0, 0 );
    keybd_event( VK_TAB, 0x0F, 0, 0 );
    keybd_event( VK_TAB, 0x0F, KEYEVENTF_KEYUP, 0 );
    keybd_event( VK_TAB, 0x0F, 0, 0 );
    keybd_event( VK_TAB, 0x0F, KEYEVENTF_KEYUP, 0 );
    keybd_event( VK_TAB, 0x0F, 0, 0 );
    keybd_event( VK_TAB, 0x0F, KEYEVENTF_KEYUP, 0 );
    keybd_event( VK_SHIFT, 0x2A, KEYEVENTF_KEYUP, 0 );


田楽DLLを使って自前の置換ダイアログを作るとかって作戦もあるかもしれません。

[ ]
RE:10518 置換ダイアログをマクロで操作でNo.10520
igus さん 25/01/23 18:14
 
UWSCで考えてみたのですが置換にカーソルを持ってくると自動的に下検索にフォーカ
スが移るようで両方を満たすのは難しそう。マウスカーソルを全置換のボタン上に持
ってくることはできたのでENTERの代わりにマウスカーソルのクリックを使うならな
んとかなりそうですが、それよりも普通にALT+Aで全置換する方が簡単かと思います。

//置換ボタンにマウスカーソル.uws
sleep(0.05)
ACW(GETID("秀丸","Hidemaru32Class"))
ACW(GETID("置換","#32770"))
KBD(VK_ALT,DOWN,50)
KBD(VK_E,CLICK,50)
KBD(VK_ALT,UP,50)
DIM ID=GETID(GET_ACTIVE_WIN)
DIM x=STATUS(ID,ST_X)
DIM y=STATUS(ID,ST_Y)
MMV(x+350,Y+100)

[ ]
RE:10519 置換ダイアログをマクロで操作でNo.10521
popper さん 25/01/23 18:17
 
秀まるお2 さん、ありがとうございます。

まだ試せていませんが、いろいろと試してみます。

取り急ぎお礼申し上げます。

[ ]