秀丸マクロからHidemaru_GetCursorPosUnicNo.09261
Ganohr さん 20/08/28 14:10
 
お世話になります。

現在ダブルクリック拡張マクロを開発しています。

既に選択済みのテキストをダブルクリックした場合に、マウス座標をもとにテキスト
を選択しなおす処理を記述したいと考えています。

ヘルプを参照すると「Hidemaru_GetCursorPosUnicodeFromMousePos」という項目を見
つけたのですが、秀丸マクロからどのようにして呼び出せばよいのかわかりませんで
した。

loaddll "????";
dllfunc("Hidemaru_GetCursorPosUnicodeFromMousePos", 0, #cx, #cy);

#cx, #cyにカーソル位置を格納したいと考えております。

以上、よろしくお願いいたします。

[ ]
RE:09261 秀丸マクロからHidemaru_GetCursNo.09264
秀丸担当 さん 20/08/28 16:22
 

Hidemaru_GetCursorPosUnicodeFromMousePosは、DLLを自作している場合に、DLLその
ものから呼び出すための関数になっています。
loaddllでdllfuncで呼び出すことはできないです。
また、これに相当するマクロ文も無いです。

ダブルクリックで実行するマクロだとしたら、[その他]→[キー割り当て...]で、左
ダブルクリックにマクロを割り当てられているということかと思います。
でもその場合、シングルクリックの時点で範囲選択は解除されてしまうので、もしDL
Lを自作したとしても、左ダブルクリックで範囲選択を取得したりするのは方法が無
い気がします。
何か勘違いでしたらすみません。

[ ]
RE:09264 秀丸マクロからHidemaru_GetCursNo.09265
Ganohr さん 20/09/01 12:03
 
>
> ......
>何か勘違いでしたらすみません。

ご返信ありがとうございます。

現状はダブルクリックで選択動作、トリプルクリックで特殊な選択動作として実装し
ているので問題はありません。

マウス座標を元に該当する位置を取得することは、通常のマクロでも必要になる機能
であると考えますので、マクロへの実装を期待したいと思います。

以上、ご返信ありがとうございました。

[ ]
RE:09265 秀丸マクロからHidemaru_GetCursNo.09266
秀丸担当 さん 20/09/01 12:49
 

ダブルクリックで選択範囲を維持できるかどうかはとりあえず置いておいて、マウス
カーソルの位置から行と桁のカーソル位置を得る方法が通常のマクロからもできたら
いいということで、今後検討しようと思います。

現状では、DLL側から呼ぶ用なので、わざわざこのためにDLLを作る必要があります。
例えば以下のようなC++で拡張子.cppのファイルを作成します。

#include <windows.h>
extern "C" __declspec( dllexport )
int MyDllFunc() {
    HINSTANCE hinstExe = GetModuleHandle( NULL );
    BOOL (WINAPI* pfnHidemaru_GetCursorPosUnicodeFromMousePos)( POINT* ppt,
int* pnLineNo, int* pnColumn );
    *(FARPROC*)&pfnHidemaru_GetCursorPosUnicodeFromMousePos = GetProcAddress
( hinstExe, "Hidemaru_GetCursorPosUnicodeFromMousePos" );
   
    if( pfnHidemaru_GetCursorPosUnicodeFromMousePos ) {
        POINT pt;
        GetCursorPos( &pt );
        int nLineNo = 0;
        int nColumn = 0;
        if( pfnHidemaru_GetCursorPosUnicodeFromMousePos( &pt, &nLineNo, &nCo
lumn) ) {
            return MAKELONG(nLineNo,nColumn);
        }
    }
    return 0;
}

これをDLLとしてコンパイルできる環境が必要です。
最近だとVisual Studio Community 2019で、Win32プロジェクトでDLLで空の内容とし
て作成し、.cppファイルを追加してビルドします。
以前ちらっと見たあべのりさんの方法だと、わざわざプロジェクトを作成しなくても、
cl.exeで簡単にDLLを作成できるみたいです。
参考:https://www.maruo.co.jp/hidesoft/2/x38106_.html#38112
Visual Studioがインストールされている状態で、コマンドプロンプトで以下のよう
にすると32bit版のDLLができました。
cl /EHcs /LD test.cpp user32.lib

これを呼び出すマクロの例は以下のような感じになります。

マクロの例:
loaddll @"C:\Folder\test.dll";
#dw=dllfunc("MyDllFunc");
if(#dw==0){
    message "カーソル位置なし";
} else {
    message "行:"+str(#dw&0xffff)+"\n桁:"+str((#dw&0xffff0000)/0x00010000);
}
endmacro;

[ ]
RE:09266 秀丸マクロからHidemaru_GetCursNo.09267
秀丸担当 さん 20/09/01 14:04
 

すみません。補足です。
DLLから呼ばれる用の関数群はUnicodeの数え方なので、そのままではmoveto2などで
使うのは面倒でした。
数え方はwideindex_to_charindexで変換する必要がありました。

例:
loaddll @"C:\Folder\test.dll";
#dw=dllfunc("MyDllFunc");
if(#dw!=0){
    #y2=#dw&0xffff;
    #x2=(#dw&0xffff0000)/0x00010000;
    $line=gettext2(0,#y2,0,#y2+1);
    #x2=wideindex_to_charindex($line,#x2);
    moveto2  #x2,#y2;
}
endmacro;

DLLを使わずマクロから直接使う関数を作る場合は、こういった変換なしでできるよ
うにしようと思います。

[ ]
RE:09267 秀丸マクロからHidemaru_GetCursNo.09268
秀丸担当 さん 20/09/02 13:28
 

V8.94β8で、mouselineno, mousecolumnキーワードを追加してみています。
命名規則(?)が違っていて発見しづらいかもしれません。ヘルプの該当ページにリン
クを付けておこうと思います。

[ ]
RE:09268 秀丸マクロからHidemaru_GetCursNo.09269
Ganohr さん 20/09/03 13:50
 
>
>V8.94β8で、mouselineno, mousecolumnキーワードを追加してみています。
>命名規則(?)が違っていて発見しづらいかもしれません。ヘルプの該当ページにリン
>クを付けておこうと思います。

ご対応ありがとうございました。
目的の動作を確認できました。

movetolineno mousecolumn, mouselineno;
selectword;

色々とマクロ開発の幅が広がると思われます。

以上、ご対応ありがとうございました。

[ ]