[ 新規に投稿する ]

置換ダイアログをマクロで操作できますか?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 さん、ありがとうございます。

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

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

[ 新規に投稿する ]