IsHidemaruMailGrep関数についてNo.04283
さん 18/11/14 09:05
 
 こんにちは、お世話になります。

 秀丸メールのマクロヘルプに

>IsHidemaruMailGrep関数は、現在のマクロが秀丸メールの検索結果ウィンドウ中の
>メール内容部分で実行されてるかどうかを返します。

とあるんですが、検索結果ウィンドウのメール一覧枠とかにフォーカスされていても、
1が返ってきているような気がします。
 これはこういう仕様なのか、それともバグなのか、どちらでしょうか。
 そして、もしバグだとしたら、検索結果ウィンドウのメール内容枠で実行されてる
かどうかを調べる方法はありますでしょうか。
 CurrentPane関数は、本体ウィンドウじゃないと効かないみたいなので、もし方法
がありましたら、教えていただけると幸いです。

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

[ ]
RE:04283 IsHidemaruMailGrep関数についてNo.04289
秀まるお2 さん 18/11/14 11:00
 
 この辺の仕組みについて説明させていただきます。

 秀丸メールのマクロですが、マクロを実行するのは秀丸メールの中にある秀丸エデ
ィタ相当のウィンドウ部品の中でってことになります。

 例えば秀丸メール本体ウィンドウと検索結果ウィンドウが出てる場合、秀丸エディ
タ相当のウィンドウ部品は、秀丸メール本体ウィンドウの中と、検索結果の中と、2
つが存在してることになります。

 秀丸メール本体ウィンドウが2枠区切りの場合、メール内容枠が存在しないので、
秀丸エディタ相当のウィンドウ部品は存在しないように見えますが、実は見えない所
にあります。検索結果のウィンドウでも、メール内容を非表示にしてても、実は秀丸
エディタ相当のウィンドウ部品は見えない所にあります。

 秀丸メール本体ウィンドウ上で何かすごく時間のかかるマクロを実行したとします。
そのマクロが動いてる最中に検索結果ウィンドウをクリックしてそっちをアクティブ
にしたとします。その場合、マクロは相変わらず秀丸メール本体ウィンドウ上で実行
されつづけます。

 秀丸メール本体ウィンドウ上のマクロで、例えば

   #n = dllfunc("SetGrepWndTop");

 を実行すると、マクロ実行が検索結果上の秀丸エディタ相当部分に移動します。

 そういうことで、つまり、フォーカスがどこにあるのか、アクティブウィンドウは
どこかってことと、マクロがどこで実行されてるかは必ずしも一致しないことがあり
ます。そういう前提条件を理解いただく必要があります。

>> IsHidemaruMailGrep関数は、現在のマクロが秀丸メールの検索結果ウィンドウ中
>のメール内容部分で実行されてるかどうかを返します。
>
> とあるんですが、検索結果ウィンドウのメール一覧枠とかにフォーカスされていて
>も、1が返ってきているような気がします。

 上記の話を理解いただければもう答えは理解いただけると思いますが、つまり、さ
っきの先の例にあるように、「秀丸メール本体ウィンドウ上でマクロを実行してる最
中に検索結果ウィンドウをアクティブにしただけ」みたいな状態だと、マクロは相変
わらず秀丸メール本体ウィンドウ上で実行されつづけます。そういう場合はIsHidema
ruMailGrep関数は0を返します。

 マクロの中でSetGrepWndTop関数を使ったりとか、あるいはそもそも的にマクロが
検索結果ウィンドウ上で実行された場合には、IsHidemaruMailGrep関数は1を返します。

 フォーカスがどこにあるかとか、アクティブウィンドウがどこかというのはまった
く関係ないです。

>  そして、もしバグだとしたら、検索結果ウィンドウのメール内容枠で実行されて
>るかどうかを調べる方法はありますでしょうか。

 検索結果ウィンドウ上で実行されてる場合で、フォーカスがメール一覧にあるかど
うか調べたいってことだとしたら、例えばこんなマクロになります。

    loaddll "tkinfo.dll";
    #focus = dllfunc("Bypass_GetFocus");
    #listwnd = dllfunc("GrepListWnd");
    if( #focus == #listwnd ) {
        message "メール一覧にフォーカスがあります。";
    } else {
        message "#focus != #listwnd";
    }


[ ]
RE:04289 IsHidemaruMailGrep関数についてNo.04296
さん 18/11/16 10:41
 
 お世話になります。

> 秀丸メールのマクロですが、マクロを実行するのは秀丸メールの中にある秀丸エ
>ディタ相当のウィンドウ部品の中でってことになります。
(中略)
> そういうことで、つまり、フォーカスがどこにあるのか、アクティブウィンドウ
>はどこかってことと、マクロがどこで実行されてるかは必ずしも一致しないことが
>あります。そういう前提条件を理解いただく必要があります。

 なるほど、そういうことなんですね。
 やっと理解できたような気がします。

> 上記の話を理解いただければもう答えは理解いただけると思いますが、つまり、
>さっきの先の例にあるように、「秀丸メール本体ウィンドウ上でマクロを実行して
>る最中に検索結果ウィンドウをアクティブにしただけ」みたいな状態だと、マクロ
>は相変わらず秀丸メール本体ウィンドウ上で実行されつづけます。そういう場合はI
>sHidemaruMailGrep関数は0を返します。
>
> マクロの中でSetGrepWndTop関数を使ったりとか、あるいはそもそも的にマクロが
>検索結果ウィンドウ上で実行された場合には、IsHidemaruMailGrep関数は1を返しま
>す。
>
> フォーカスがどこにあるかとか、アクティブウィンドウがどこかというのはまっ
>たく関係ないです。

 了解しました。

> 検索結果ウィンドウ上で実行されてる場合で、フォーカスがメール一覧にあるか
>どうか調べたいってことだとしたら、例えばこんなマクロになります。

 こちらの説明が不十分だったようで、申し訳ないです。
 私が行いたかったのは、検索結果ウィンドウ上の「内容の表示」をチェックした状
態で、検索結果ウィンドウ上のメールの内容が表示されてる部分にフォーカスされて
いるかどうかを調べたいということでした。
 そのようなことは可能なのでしょうか。

 それでは。


[ ]
RE:04296 IsHidemaruMailGrep関数についてNo.04299
秀まるお2 さん 18/11/16 14:05
 
>  私が行いたかったのは、検索結果ウィンドウ上の「内容の表示」をチェックした
>状態で、検索結果ウィンドウ上のメールの内容が表示されてる部分にフォーカスさ
>れているかどうかを調べたいということでした。

 かなり強引ですが、Bypass系関数(=Windows API)を駆使してなんとか以下のマク
ロで実現できました。

    loaddll "tkinfo.dll";
    #focus = dllfunc("Bypass_GetFocus");
    #grep = dllfunc("GrepWnd");
    message hex(#grep);
    #hideframe = dllfunc("Bypass_FindWindowEx", #grep, 0, "Hidemaru32Class",
 0);
    message hex(#hideframe);
    #hidechild = dllfunc("Bypass_GetWindow", #hideframe, 5);  //GW_CHILD
    message hex(#hidechild);
    if( #focus == #hidechild ) {
        message "メール内容にフォーカスがあります。";
    } else {
        message "#focus != #hidechild";
    }

[ ]
RE:04299 IsHidemaruMailGrep関数についてNo.04304
さん 18/11/16 14:24
 
 お世話になります。

> かなり強引ですが、Bypass系関数(=Windows API)を駆使してなんとか以下のマ
>クロで実現できました。

 ありがとうございます。
 大変助かりました。

 以上、今後ともよろしくお願いいたします。

[ ]