[ 新規に投稿する ]

秀丸マクロからHidemaru_GetCursorPosUnicodeFromMousePosを呼びNo.09261
Ganohr さん 20/08/28 14:10 [ コメントを投稿する ]
  お世話になります。

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

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

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

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

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

以上、よろしくお願いいたします。
[ ]
RE:09261 秀丸マクロからHidemaru_GetCursorPosUnicodeFromMousNo.09264
秀丸担当 さん 20/08/28 16:22 [ コメントを投稿する ]
 
Hidemaru_GetCursorPosUnicodeFromMousePosは、DLLを自作している場合に、DLLそのものから呼び出すための関数になっています。
loaddllでdllfuncで呼び出すことはできないです。
また、これに相当するマクロ文も無いです。

ダブルクリックで実行するマクロだとしたら、[その他]→[キー割り当て...]で、左ダブルクリックにマクロを割り当てられているということかと思います。
でもその場合、シングルクリックの時点で範囲選択は解除されてしまうので、もしDLLを自作したとしても、左ダブルクリックで範囲選択を取得したりするのは方法が無い気がします。
何か勘違いでしたらすみません。
[ ]
RE:09264 秀丸マクロからHidemaru_GetCursorPosUnicodeFromMousNo.09265
Ganohr さん 20/09/01 12:03 [ コメントを投稿する ]
  >
> ......
>何か勘違いでしたらすみません。

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

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

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

以上、ご返信ありがとうございました。
[ ]
RE:09265 秀丸マクロからHidemaru_GetCursorPosUnicodeFromMousNo.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, &nColumn) ) {
            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_GetCursorPosUnicodeFromMousNo.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_GetCursorPosUnicodeFromMousNo.09268
秀丸担当 さん 20/09/02 13:28 [ コメントを投稿する ]
 
V8.94β8で、mouselineno, mousecolumnキーワードを追加してみています。
命名規則(?)が違っていて発見しづらいかもしれません。ヘルプの該当ページにリンクを付けておこうと思います。
[ ]
RE:09268 秀丸マクロからHidemaru_GetCursorPosUnicodeFromMousNo.09269
Ganohr さん 20/09/03 13:50 [ コメントを投稿する ]
  >
>V8.94β8で、mouselineno, mousecolumnキーワードを追加してみています。
>命名規則(?)が違っていて発見しづらいかもしれません。ヘルプの該当ページにリンクを付けておこうと思います。

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

movetolineno mousecolumn, mouselineno;
selectword;

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

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

[ 新規に投稿する ]