「SimulateKeyStroke」についてNo.06123
さん 20/01/08 20:31
 
 お世話になっております。

 自作の読み上げマクロに秀丸メールのメインウィンドウ内のメール内容枠で上下矢
印キーが押されたらキーをシミュレートして、1行読みさせる部分があります。
 この際、なぜか現在行の値(「y」)が変わらないことがあります。
 マクロが原因なのか、はたまた閲覧しているメールが原因なのか、そもそも秀丸
メールのほうに原因があるのか、よくわかりません。
 何かアドバイスをいただけますでしょうか。
 一応最低限動作確認ができるマクロを記載します。
 また、うまく動かないメールが必要ということであれば、別途お送りしますので、
ご連絡いただけると幸いです。

----- マクロサンプル -----
#n = dllfunc("SetJapaneseCodePageMode", 1);
#pane = dllfunc("CurrentPane");
if( dllfunc( "IsHidemaruMailMain") ) {
if ( iskeydown(0x26) ) {
if ( iskeydown(0x10) ) {
#n = dllfunc("SimulateKeyStroke", 0x26, 1, 0);//↑
} else {
#n = dllfunc("SimulateKeyStroke", 0x26, 0, 0); //↑
}
} else if ( iskeydown(0x28) ) {
if ( iskeydown(0x10) ) {
#n = dllfunc("SimulateKeyStroke", 0x28, 1, 0); // 下矢印
} else {
#n = dllfunc("SimulateKeyStroke", 0x28, 0, 0); // 下矢印
}
}
if( #pane == 2 ) {
message(str(y));
}
}
--------------------

 環境は、Windows10 64ビット、秀丸メール 音声化可能なバージョン 6.93β26 32
ビット版です。

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

[ ]
RE:06123 「SimulateKeyStroke」についてNo.06126
さん 20/01/09 07:11
 
 お世話になります。

 すみません、追記です。

 左右矢印に割り当てた際も、文字単位の移動がおかしくなることがあるようです。
 また、Shift+矢印キーでは、成城に移動できるようです。
 ちなみに、試したのは同じメールです。
 一応、テスト用のマクロを変更したので、書き込んでおきます。

----- マクロサンプル -----
#n = dllfunc("SetJapaneseCodePageMode", 1);
#pane = dllfunc("CurrentPane");
if( dllfunc( "IsHidemaruMailMain") ) {
if ( iskeydown(0x26) ) {
if ( iskeydown(0x10) ) {
#n = dllfunc("SimulateKeyStroke", 0x26, 1, 0);//↑
} else {
#n = dllfunc("SimulateKeyStroke", 0x26, 0, 0); //↑
}
} else if ( iskeydown(0x28) ) {
if ( iskeydown(0x10) ) {
#n = dllfunc("SimulateKeyStroke", 0x28, 1, 0); // 下矢印
} else {
#n = dllfunc("SimulateKeyStroke", 0x28, 0, 0); // 下矢印
}
} else if ( iskeydown(0x25) ) {
if ( iskeydown(0x10) ) {
#n = dllfunc("SimulateKeyStroke", 0x25, 1, 0); // 左矢印
} else {
  #n = dllfunc("SimulateKeyStroke", 0x25, 0, 0); // 左矢印
}
} else if ( iskeydown(0x27) ) {
if ( iskeydown(0x10) ) {
#n = dllfunc("SimulateKeyStroke", 0x27, 1, 0); // 右矢印
} else {
#n = dllfunc("SimulateKeyStroke", 0x27, 0, 0); // 右矢印
}
}
if( #pane == 2 ) {
message(sprintf("X:%d\nY:%d", x, y));
}
}
--------------------

 それでは。

[ ]
RE:06126 「SimulateKeyStroke」についてNo.06128
秀まるお2 さん 20/01/09 09:55
 
 テストしようと思ったんですが、このマクロをどういう風にカーソル移動キーに割
り当てておられるのか疑問を感じました。

 とりあえず、マクロ1にこのマクロを割り当てた上で、キー割り当てにて「マクロ
1」に対して下矢印キーを割り当てれば、下矢印キーを押してこのマクロが実行でき
ることを確認しましたが、カーソル移動キー4つともに割り当てるとしたら、例えば
マクロ1〜マクロ4の全部に対して同じマクロを割り当てた上で、その4つのマクロそ
れぞれにカーソル移動キーを割り当てるということになりますが、そういうやり方な
のやら?

 Shiftキーを押してる場合もってことになると、マクロ1〜マクロ8に登録した上で、
8通りのキー割り当てを登録しないといけないです。

 今ちょっと、とりあえず下矢印キーに割り当てて、10回くらい下矢印キーを押し
てみるテストをした限りはうまく動いてるかなぁと思いますけども・・・。

 再現の条件も教えて欲しいです。例えば特定のメールの特定の位置で特定の矢印
キーを押せば毎回必ず再現するのか、それとも再現する条件にまったく法則性が無く
てランダムに起きるとしか考えられないのか、あるいは完全なランダムじゃなくて、
ある程度起きやすい場所があるのかとか・・・

 例えば完全なランダムだとしたら、何回に1回の頻度くらいなのかも教えて欲しい
です。例えば100回に1回ってことなのか10回に1回なのかとか。

[ ]
RE:06128 「SimulateKeyStroke」についてNo.06129
さん 20/01/09 10:56
 
 お世話になります。。

> テストしようと思ったんですが、このマクロをどういう風にカーソル移動キーに
>割り当てておられるのか疑問を感じました。
>
> とりあえず、マクロ1にこのマクロを割り当てた上で、キー割り当てにて「マクロ
>1」に対して下矢印キーを割り当てれば、下矢印キーを押してこのマクロが実行でき
>ることを確認しましたが、カーソル移動キー4つともに割り当てるとしたら、例え
>ばマクロ1〜マクロ4の全部に対して同じマクロを割り当てた上で、その4つのマク
>ロそれぞれにカーソル移動キーを割り当てるということになりますが、そういうや
>り方なのやら?

 はい、そういうやり方で合っています。

> Shiftキーを押してる場合もってことになると、マクロ1〜マクロ8に登録した上で、
>8通りのキー割り当てを登録しないといけないです。

 いえ、Shiftキーが押されてるかどうかは、マクロ側でiskeydownで取得しているの
で、Shift+矢印用のマクロを登録して、キー割り当てする必要はないです。
 要するに上下左右の矢印用のマクロ4つを登録して、上下左右の矢印キーに割り当
てれば、動くはずです。

> 再現の条件も教えて欲しいです。例えば特定のメールの特定の位置で特定の矢印
>キーを押せば毎回必ず再現するのか、それとも再現する条件にまったく法則性が無
>くてランダムに起きるとしか考えられないのか、あるいは完全なランダムじゃなく
>て、ある程度起きやすい場所があるのかとか・・・

 メールによって現象が発生するメールと発生しないメールがあるようです。
 現象が発生するメールの場合、上下左右の矢印を押してもxやyの値が増えず、1行
目の1文字目から動きません。
 とりあえず、現象が発生するメールを個人メールで送らせていただきます。

 それでは。




[ ]
RE:06128 「SimulateKeyStroke」についてNo.06130
秀まるお2 さん 20/01/09 11:28
 
 とりあえず、yが変化してるかどうかチェックして、変化してなければメッセージ
表示するようにしてみました。yの位置はタイトルバーで分かるようにしてみました。

 NVDA + 秀丸メールV6.93β26音声化バージョン + 秀丸リーダー でしばらくテスト
してみた限りでは、とりあえずメールの先頭で上矢印キーを押した場合、およびメー
ルの末尾で下矢印キーを押した時はメッセージ表示されますが、他のケースでは大丈
夫そうでした。SimulateKeyStroke関数の処理も見直してみたんですが、普通にキー
押下のメッセージをSendMessageしてるだけなので、たまたま動かないことがあるっ
て可能性は無さそうな気がします。

 あと、僕の所だと、上下矢印キーを押すと、なぜか秀丸メール上だけ、NVDAが「ブ
ランク」って発音してしまいます。これの抑止方法がもし分かったら教えて欲しいで
す。

------------------------------テスト用のマクロ-----------------------------
    loaddll "tkinfo.dll";
    #n = dllfunc("SetJapaneseCodePageMode", 1);
    #pane = dllfunc("CurrentPane");
    #yPrev = y;
    #checkY = 0;
    if( dllfunc( "IsHidemaruMailMain") ) {
        if ( iskeydown(0x26) ) {
            if ( iskeydown(0x10) ) {
                #n = dllfunc("SimulateKeyStroke", 0x26, 1, 0);//↑
            } else {
                #n = dllfunc("SimulateKeyStroke", 0x26, 0, 0); //↑
            }
            #checkY = 1;
        } else if ( iskeydown(0x28) ) {
            if ( iskeydown(0x10) ) {
                #n = dllfunc("SimulateKeyStroke", 0x28, 1, 0); // 下矢印
            } else {
                #n = dllfunc("SimulateKeyStroke", 0x28, 0, 0); // 下矢印
            }
            #checkY = 1;
        } else if ( iskeydown(0x25) ) {
            if ( iskeydown(0x10) ) {
                #n = dllfunc("SimulateKeyStroke", 0x25, 1, 0); // 左矢印
            } else {
              #n = dllfunc("SimulateKeyStroke", 0x25, 0, 0); // 左矢印
            }
        } else if ( iskeydown(0x27) ) {
            if ( iskeydown(0x10) ) {
                #n = dllfunc("SimulateKeyStroke", 0x27, 1, 0); // 右矢印
            } else {
                #n = dllfunc("SimulateKeyStroke", 0x27, 0, 0); // 右矢印
            }
        }
        if( #pane == 2 ) {
            title str(y);
            title -1;
            if( #checkY != 0 ) {
                if( #yPrev == y ) {
                    message "yが変化してません。";
                }
            }
        } else {
            title "#pane = " + str(#pane);
            title -1;
        }
    }


[ ]
RE:06130 「SimulateKeyStroke」についてNo.06131
秀まるお2 さん 20/01/09 11:39
 
 テストしてて確実に再現するメールが1つありました。欧文文字コードのメールだ
とダメでした。

   SetJapaneseCodePageModeを実行した時に、欧文文字コードのメールでカーソルが
メール本文の先頭に勝手に移動してしまいます。なのでこれを外せば大丈夫じゃない
かと思います。

----------------------
 っとテストした後にサンプルメール届きました。届いたサンプルメールは、両方と
も欧文のメールでした。

 ということで、そういうことで正解のようです。SetJapaneseCodePageModeをコメ
ントアウトしたら起きなくなりました。

[ ]
RE:06131 「SimulateKeyStroke」についてNo.06133
さん 20/01/09 14:27
 
 お世話になります。

>   SetJapaneseCodePageModeを実行した時に、欧文文字コードのメールでカーソル
>がメール本文の先頭に勝手に移動してしまいます。なのでこれを外せば大丈夫じゃ
>ないかと思います。

 なるほど、「SetJapaneseCodePageMode」が原因だったんですね。
 全然気づきませんでした。
 とりあえず、コメントアウトしたところ、うまく動きましたが、「SetJapaneseCod
ePageMode」を利用すると、メール本文の先頭にカーソルが移動してしまうのは、仕
様でしょうか。
 個人的には、修正できるようであれば、修正していただけるとうれしいですが、仕
様ということであれば、「SetJapaneseCodePageMode」のヘルプに何か一言追記して
いただけるとうれしいです。

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

[ ]
RE:06133 「SimulateKeyStroke」についてNo.06134
秀まるお2 さん 20/01/09 15:13
 
 SetJapaneseCodePageModeを呼び出すとメール内容を表示してる秀丸エディタ相当
部分がもしも外国語表示の状態なら、日本語コードページでメールを表示しなおす動
作が動いてしまいまして、その時にカーソル位置がリセットされてしまってました。

 カーソル位置を変更せずにコードページのみ変更するようにはたぶん出来ると思い
ます。一回トライしてみます。出来ない場合はヘルプに制限として記載させていただ
きます。

[ ]
RE:06134 「SimulateKeyStroke」についてNo.06135
秀まるお2 さん 20/01/09 18:35
 
 カーソル位置(&範囲選択の状態)がキープできるように修正できました。

 一応、ヘルプにはその辺の仕様についての記載も追加させていただきます。

[ ]
RE:06135 「SimulateKeyStroke」についてNo.06136
さん 20/01/10 13:35
 
 お世話になります。

> カーソル位置(&範囲選択の状態)がキープできるように修正できました。

 修正できたとのことで、よかったです。

> 一応、ヘルプにはその辺の仕様についての記載も追加させていただきます。

 ありがとうございます。
 よろしくお願いします。

 それでは。

[ ]