秀丸でマウスがHANDになっている方法を知No.09351
天翔記.jp さん 17/02/27 12:54
 
いつもお世話になっております、天翔記.jpです。

hidemaru.exeのプロセス内で、自作dll内で記述するようなC言語層での質問となり
ます。

■秀丸のエディタの文字列に下線が付いた状態で、マウスがハンドになっていること
を知りたい

 秀丸エディタの編集領域(クラス HM32CLIENT)上で、
 ウェブサイトアドレスっぽいものや、ファイル名っぽいものには下線が付き、
 その上にマウスが行くと、手がハンドの形になります。

 この、「マウスが(下線上の文字列に乗ったことで)手がハンドになっている」
 ということを知る手立てはありますか?
 (マクロ層ではなく、秀丸プロセス内前提でC言語ごりごりで)


 以下のうちどちらかが知れればよいと考えています。
 (他にも、マウスの下のウィンドウのクラス名や、
   現在のプロセスとウィンドウの帰属の一致、
   等々による別の判定は入れ込んでいます)

・下線の上にマウスが乗っている
  (多分これは秀丸の関数が見えてないので難しいと判断しています)

・マウスがハンドの形になっている
 (これは普通は可能なのですが、
  秀丸が特殊なやり方をしているのか、上手く判定できませんでした)

 以下、試してみたソースです。

 // う〜ん、いつもfalse というか、そもそも
 // 秀丸上でマウス形状がどのように変化してもhCursorのハンドル値が変化してい
ない。
bool IsHandCursor() {

 HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);

 HCURSOR hCursor = GetCursor();

 if (hCursor == LoadCursor(hInstance, IDC_HAND)) {
  OutputDebugStream(L"HAND\n");
  return true;
 }
 else {
  OutputDebugStream(L"OTHER\n");
  return false;
 }
}

 何か適当な感じで判定できるような気がするのですが、

PICONINFO piconinfo;
GetIconInfo(hCursor, piconinfo);

のpiconinfoのフィールドを見て判定できたりしますか?

以上、質問となります、よろしくお願いします。

[ ]
RE:09351 秀丸でマウスがHANDになっているNo.09352
秀丸担当 さん 17/02/27 14:14
 

秀丸エディタとしてカーソル形状を取得する関数は用意されていないです。
マクロの場合はカーソル位置の色としてcolorcodeというキーワードで取得でき
ます。

フォーカスのあるスレッドと同一スレッドであればGetCursorでできるので、た
ぶんマルチスレッドでの話だと思います。
別スレッドではGetCursorを使うためにはAttachThreadInputすれば無理矢理でき
たりすると思いますが、UI周りの挙動が怪しくなるので使用は避けたほうがいい
と思います。
GetCursorInfoという関数もあって、こちらの場合は別スレッドにフォーカスが
あってもできるのではないかと思います。

[ ]
RE:09352 秀丸でマウスがHANDになっているNo.09353
天翔記.jp さん 17/02/27 20:55
 
>GetCursorInfoという関数もあって、こちらの場合は別スレッドにフォーカスが
>あってもできるのではないかと思います。
GetCursorInfoで取得した場合は、hCursorの値が有効に変化していました。
ありがとうございます。
(別プロセスだとGetCursorはダメと認識していましたが、別スレッドでもダメだった
んですね、
 勉強になりました)

[ ]