since 2022-10-04
https://github.com/nvdajp/nvdajp/issues/220
https://github.com/nvdajp/nvdajp/issues/266
Windows 10/11 モダンIME対応のための調査。
現状
windowsinternal_composableshell_experiences_textinput_inputapp.py
で実装されており、同じファイル名で scratchpad/appModules フォルダにモジュールを置くと挙動を上書きできる。
以下は Windows を英語UIにして、メモ帳で文字変換して最初の候補ウィンドウが開いた状態を inspect.exe で調べた情報。
- "Desktop 1" pane -- "Windows Input Experience" window --- "Microsoft Candidate UI" menu : AutomationId=IME_Candidate_Window ---- "Candidate Item Panel" list : AutomationId=TEMPLATE_PART_CandidatePanel ----- "漢字" list item ------ "1" text : AutomationId=TEMPLATE_PART_CandidateItemIndex ------ "漢字" text : AutomationId=TEMPLATE_PART_CandidateItemText ------ "" text : AutomationId=TEMPLATE_PART_CandidateItemAnnotation ------ "桐?" text (不明) ----- 候補 list item が複数つづく ----- "Pager" menu : AutomationId=TEMPLATE_PART_CandidatePanel_Pager ----- "Previous Page" button : AutomationId=TEMPLATE_PART_PagePreviousButton ----- "Next Page" button : AutomationId=TEMPLATE_PART_PageNextButton ----- "Press [Tab] to open the table view" button : AutomationId=TEMPLATE_PART_TableViewButton ----- "Emoji and Symbol" button : AutomationId=TEMPLATE_PART_EmojiButton
スピーチビューアの記録
k a n j i と入力して1回目のスペースキーを押すと
カンジルノ カン hiragana じ
2回目のスペースキーを押すと候補ウィンドウが開いて下記がスピーチビューアに表示される。最初に候補を詳細読みしているが、直後に候補ウィンドウのほかの情報の読み上げが行われ、ユーザーからは「読み上げていない」ように聞こえる。
トーヨーカンジノ カン モジノ ジ 漢字 2 2 of 105 Windows Input Experience window Candidate Item Panel list 漢字 2 2 of 105 感じ 感じ 巻次 巻次 幹事 幹事 監事 監事 漢字 2 2 of 105
2010-12-09 nvdajp のページから IME 関連の西本のメモを移動しました。
IME 関連の作業は @hoozukiyama さんと協力して行なっていました。
since 2013-03-12
そのうち続きをやるのでメモ:
class ATOK26UIComment(IAccessible): name=_("ATOK comment") role=controlTypes.ROLE_WINDOW def event_show(self): tones.beep(880,20) log.debug("ui comment show") log.info(self.basicText) log.info(self.displayText.replace('\x00', '')) def event_gainFocus(self): log.info(self.basicText) log.info(self.displayText.replace('\x00', ''))
since 2012-08-13
inputMethods ブランチ関連
候補文字列については記号読みレベルの設定に関わらず記号を読む(nvda/inputMethods: Rev 5272):
speech.speakText(result,symbolLevel=characterProcessing.SYMLVL_ALL)
2010-01-26 Twitter 記録
その後、MLではソースから実行環境を作る情報を更新。西本は勝手に pyaa に取り組む。
2010-02-16 定例ミーティング
成果
注意:以下の設定が正しくないと再現できない
今後の課題
Twitter 記録
import 文が読み込んでいるソースファイルのディレクトリ階層はトップからの絶対位置。 ただし from . import の場合は当該ファイルからの相対位置。
NVDAObjects/IAccessible/__init__.py 363行 elif windowClassName.startswith('Mozilla'): mozCls=__import__("mozilla",globals(),locals(),[]).Mozilla clsList.append( mozCls) この __import__ の意味: mozilla.py のなかの Mozilla クラスをインポートして clsList に追加する 1394行 ###class mappings _staticMap={ 1394行 ("mscandui21.candidate",oleacc.ROLE_SYSTEM_PUSHBUTTON):"IME.IMECandidate",
どうやら mscandui21.candidate と IME.py はアジア圏のIME対応を試みたが成功しなかったときの残骸らしい。
西本が調べた情報によると "MSCandUIWindow_Candidate" と ROLE_SYSTEM_LISTITEM が IME2002 の登録に必要なクラス名とロールID。
これをやってみたのが今回のパッチ。
IMECandidate: event_objectSelection は入れてみたが、このメソッドは呼ばれていない。
(ソースはnvdajpのsvnレポジトリ)
Index: NVDAObjects/IAccessible/IME.py =================================================================== --- NVDAObjects/IAccessible/IME.py (revision 65) +++ NVDAObjects/IAccessible/IME.py (working copy) @@ -5,6 +5,13 @@ class IMECandidate(IAccessible): + def __init__(self, *argv, **kw): + super(IMECandidate, self).__init__(*argv, **kw) + name = super(IMECandidate,self)._get_value() + if name is not None: + print "IMECandidate: " + name + speech.speakText(name) + def _handleNewCandidate(self): oldNav=api.getNavigatorObject() if oldNav.windowClassName!=self.windowClassName: @@ -20,3 +27,7 @@ def event_stateChange(self): if self.event_objectID>=1 and self.event_objectID<=9: self._handleNewCandidate() + + def event_objectSelection(self): + print "IMECandidate: event_objectSelection" + self._handleNewCandidate() # nvdajp Index: NVDAObjects/IAccessible/__init__.py =================================================================== --- NVDAObjects/IAccessible/__init__.py (revision 65) +++ NVDAObjects/IAccessible/__init__.py (working copy) @@ -366,6 +366,9 @@ elif windowClassName.startswith('bosa_sdm'): sdmCls=__import__("msOffice",globals(),locals(),[]).SDM clsList.append(sdmCls) + elif windowClassName.startswith('MSCandUIWindow'): # nvdajp + sdmCls=__import__("IME",globals(),locals(),[]).IMECandidate + clsList.append(sdmCls) if windowClassName.startswith('RichEdit') and winUser.getClassName(winUser.getAncestor(windowHandle,winUser.GA_PARENT)).startswith('bosa_sdm'): sdmCls=__import__("msOffice",globals(),locals(),[]).RichEditSDMChild clsList.append(sdmCls) @@ -1391,6 +1394,7 @@ ("AVL_AVView",oleacc.ROLE_SYSTEM_TEXT):"adobe.AcrobatTextNode", ("AcrobatSDIWindow",oleacc.ROLE_SYSTEM_CLIENT):"adobe.AcrobatSDIWindowClient", ("mscandui21.candidate",oleacc.ROLE_SYSTEM_PUSHBUTTON):"IME.IMECandidate", + ("MSCandUIWindow_Candidate",oleacc.ROLE_SYSTEM_LISTITEM):"IME.IMECandidate", # nvdajp ("SysMonthCal32",oleacc.ROLE_SYSTEM_CLIENT):"SysMonthCal32.SysMonthCal32", ("hh_kwd_vlist",oleacc.ROLE_SYSTEM_LIST):"hh.KeywordList", ("Scintilla",oleacc.ROLE_SYSTEM_CLIENT):"scintilla.Scintilla",
text_services_framework ReadComp の処理を取り込む。
どうやら共有メモリの処理が必要。
成果はこちら:
http://files.nishimotz.com/ReadCompPython-100321.zip
コマンドプロンプトで一番上のディレクトリにある readcomp.py を実行すると 30秒、数字が表示されつづけます。 その間にメモ帳を開いてかな漢字変換をすると、そのたびにイベントが呼ばれた回数が インクリメントされて数字が増えます。
ポイントは rcomplib.dll で共有メモリを使って、メモ帳・IME・TSFのプロセスが 書き換えた情報を、Python 側のプロセスで読めるようにしたところです。
C++のプロジェクトは rcomplib のデバッグビルドしか使っていません。
技術的なメモ
Twitterでの発言
Togetter によるまとめ: http://togetter.com/li/33404
~nvdajp/nvdajp/2010.2 ブランチの 3875
http://bazaar.launchpad.net/~nvdajp/nvdajp/2010.2/revision/3875
MS-IME 2002 の未確定文字の読み上げが、私がいじっているバージョンで いつのまにか動かなくなっていることに気づきました。 少なくとも 2010.2j ポータブルでは上手く動いているので、 対応するブランチを探してみました。 http://bazaar.launchpad.net/~nvdajp/nvdajp/2010.2/changes 3876までが10月29日。3877が11月5日。 リリースされた 2010.2j は 3876 ベースだと思うのですが。 bzr branch lp:nvdajp/2010.2 nvdajp_2010_2_r3876 -r 3876 bzr branch lp:nvdajp/2010.2 nvdajp_2010_2_r3877 -r 3877 Windows XP SP3 +メモ帳+ MS-IME 2002 の環境で この2つを比べたところ、3876 では問題がなく、 3877 では未確定文字の読み上げができない、という状況。 ちなみに、どちらもメニューが日本語ではなく英語になります。。
リリースされた 2010.2j は 3876 ベース
以下、nvdajp-dev ML でフォローしていただいた情報:
●2010.2j の履歴については次のリンクを参照してみて下さい。 https://code.launchpad.net/~nvdajp/nvdajp/2010.2 ●MiscellaneousDependenciesの履歴については次のリンクを参照してみて下さい。 https://code.launchpad.net/~nvdajp/nvdajp/MiscellaneousDependencies ●リリース後の最新更新版は以下の組み合わせです。 ~nvdajp/nvdajp/2010.2 : 3879 ~nvdajp/nvdajp/MiscellaneousDependencies : 21 メモ ※本家NVDAのソースにIMEの最新版を反映するには。。。 1.core.py のIMEの一部修正 2.source/nvdajpime.dll はMiscellaneousDependencies : 21 のものを使用 3.source/nvdajp_ime.py は2010.2 : 3879 のものを使用 4.source/nvdajp_keyEvents.py は2010.2 : 3879 のものを使用
nvdajpime.dll について。
ファイルサイズ 54784 バイトのバージョンが過去に存在した。
http://bazaar.launchpad.net/~nvdajp/nvdajp/MiscellaneousDependencies/files/head:/source/
にあるものはファイルサイズ 20480 バイト
lp:~k-tsuzi/nvdajp/main k_tsuzi
上記の 20480 バイトの nvdajpime.dll と組み合わせたらちゃんとIME読み上げできた。
リリースされている 2010.2j は 20480 バイトの nvdajpime.dll
1.64ビットOS対応 選択肢としては、以下のいずれか? ●64ビットベースでの対応 ●32ビットベースでの対応 2.日本語ON、OFFのタイミング修正 ●取得タイミングの問題、イベントトリガーの見直。 3.TSF、IMM32の切り替えスイッチの検討 ●WinXPで動作させる場合の検討課題。 4.他スクリーンリーダーとの連携 ●入力読み上げON、OFFスイッチの検討 ※サブスクリーンリーダーとしての使用を想定