ID:???WheelRedirect.ahkを使用するとTerapadでマウスホイールが効かなくなる件がスクリプト質問スレッドで報告されていた。http://lukewarm.s101.xrea.com/test/read.cgi/bbs/1095764510/143TreaPadを落としてきて試したところ、SendMessageがFAILになっている。MouseGetPosではウィンドウのハンドルとコントロールのClassNN(TEditor1)は正しく取得されているはずである。VisualStudioに付いていたSpy++でTEditor1に送られるメッセージを監視してみたところ、メッセージが送られていないらしかった。VxEditorなど他のプログラムではちゃんと送られる。試しに他のコントロール操作系コマンドでもためしてみたが、いずれもTEditor1の操作には失敗する。最近追加されたコントロールのウィンドウハンドルを指定して直接操作する機能で代用することに。%ctrl%」に変更する。http://lukewarm.s101.xrea.com/myscripts/WheelRedirect.zipさて、コントロール操作系コマンドでTeraPadのTEditorが操作できない問題は、TeraPadの問題ではなくAutoHotkeyの問題のような気がする。Spy++で調べたところ、TeraPadのウィンドウには「TEdit」コントロールと「TEditor」コントロールが存在しているのだ。AutoHotkeyのことだから、文字列の比較方法を間違ってTEditをTEditorと誤認識しているのだろう。他にも「TTeraPadExeName」等という訳の分からないコントロールが配置されていて気味が悪いが、今回は無視する。ソースコードを検索して「ClassNN」という記述を探したところ、EnumControlFindという関数をみつけた。コントロールをリストアップするときに呼ばれて、探しているコントロールかどうかをチェックするという物らしい。大量にあったコメントを削除したため、やたら行番号が飛んでいる。caller.最初のif条件に一致すると、ClassNNによる判別が行われる。886行目でws.mCandidateTitleに候補ウィンドウのクラス名が代入される。lengthにはクラス名の長さが返される。(「TEdit」なら「5」)次が問題で、ws.mCriterionClass(与えられた検索対象ClassNN(今回の場合「TEditor1」))とws.mCandidateTitleを「先頭のlength文字」で比較している。「TEditor1」の先頭5文字は「TEdit」であり、本当は別物なのに一致とみなされてしまう。「++ws.mAlreadyVisitedCount」で「見つかった数」を増やして、_itoaで文字列に変換した物をws.mCriterionClassのlength文字目以降と比較している。本来なら「TEdit3」の「3」の部分と「1」を比較するようなものだが、今回は「TEditor1」の「or1」の部分と「1」を比較してしまう。不一致とみなされ、mAlreadyVisitedCountを間違って増やしたまま関数を抜けてしまう。本当に探している「TEditor1」を検査するときは、mAlreadyVisitedCountは「2」になってしまうので、やはり不一致とみなされる。結局一致するコントロールは見つからず、一致コントロール無しということでコマンドは失敗してしまう。TeraPadを操作したいだけなら、直接「TEditor2」と指定してやれば見つかるようだが、WheelRedirect.ahkのように動的にClassNNを扱う場合は通用しない。そんなわけで、予想通りの問題だった。Reportsに報告しておくか。2005-10-08。