フォーカス位置のハイライト機能
Windows 8 でフォーカス位置のハイライトが動きました。
まだまだ Windows API のサンプルをコピーペーストで寄せ集めたような実装で、リリースできるレベルまでは多くの改良が必要ですが、とりあえず BitBucket の下記のレポジトリに push しています。
https://bitbucket.org/nishimotz/nvdajp/
ブランチ highlight
なお現状では UI Automation を使っているので Windows 7/8 でしか動かないと思います。
下記のコミットで、タスクバーに不必要なアイコンを表示しないように改良しました。
highlight d764e12
ハイライト表示の処理は安定してきたので、UIAHandler にパッチをあてないでグローバルプラグインだけで実装できないか、検討してみたいと思います。
下記のコミットで MSAA を使う方法に変更しました。
bitbucket ブランチ highlight c69dc21
完全に globalPlugins だけで動くようになったと思いますが、もう少しテストします。。
highlight global plugin 130523
インストール環境の NVDA 2013.1jp で設定ディレクトリの globalPlugins に添付した highlight.py を置いて、フォーカスハイライトの動作を確認しました。
ウィンドウがリサイズした場合や、レビューカーソルがフォーカスを外れたときなど、本当は消えてほしいハイライトが消えないことがあります。
しかし、Windows 8 のナレーターのハイライトもそれほど完璧には実装されていないようなので、とりあえず興味のある人に使っていただいて、フィードバックを得たいと思います。
ちゃんとリリースするときには不要なログ出力を削ってアドオンにしたいと思います。。
focusHighlight をアドオンにしました。
https://dl.dropboxusercontent.com/u/62564469/focusHighlight-0.0.1.nvda-addon
scons でビルドできるようにして、リポジトリを作りました。
本家の nvda-addon メーリングリストや nvda-japanese-users などで告知をして、下記の意見をいただいています。
Windows 7 と xp で、デスクトップにウィンドウが何もない状態で NVDA+N を押して NVDA メニューを開いて、直後にエスケープを押し、NVDA メニューを閉じると、 "HighlightWin4" という(本来は通知されてほしくない)ウィンドウが読み上げられていることを確認しました。
もう少し調べてみます。
HighlightWin4 などの読み上げ(および不適切なフォーカス移動)を回避するように変更してみました。
Focus Highlight 0.0.2 https://dl.dropboxusercontent.com/u/62564469/focusHighlight-0.0.2.nvda-addon
フォーカスを赤で、ナビゲーターオブジェクトを緑で表示するようにしました。
Focus Highlight 0.0.3 https://dl.dropboxusercontent.com/u/62564469/focusHighlight-0.0.3.nvda-addon
うまく動かない場合もあるのですが、Windows 8 のスタート画面、Windows の電卓、 NVDA メニューの設定ダイアログなどはちゃんと動いています。
フォーカスを赤で、ナビゲーターオブジェクトとフォーカスが違う場所の時にはナビゲーターを緑で表示するようにしました。
Focus Highlight 0.0.4
https://dl.dropboxusercontent.com/u/62564469/focusHighlight-0.0.4.nvda-addon
アプリケーションによってエラーが起きることがあったので、回避する処理を追加しました。
Focus Highlight 0.0.5
https://dl.dropboxusercontent.com/u/62564469/focusHighlight-0.0.5.nvda-addon
アドオンの英語ページ(暫定): http://en.nishimotz.com/nvda_focus_highlight
nishimotz の focushighlight リポジトリが NVDA Addon Team から fork されました:
focusHighlight アドオンは readme.md を書けば本家のアドオン紹介サイトで公開してもらえる予定ですが、最後の作業が滞っています。
もう一つ、最近の開発版ソースと Skype 6.6 の組み合わせで、以下のエラーが出ています。
あまりやりたくないですが api.getNavigatorObject() が失敗したときに try 文で pass する必要があるかも知れません。
ERROR - unhandled exception (11:44:47): Traceback (most recent call last): File "_ctypes/callbacks.c", line 314, in 'calling callback function' File "userConfig\addons\focusHighlight\globalPlugins\focusHighlight.py", line 307, in WndProc updateNavigatorLocation() File "userConfig\addons\focusHighlight\globalPlugins\focusHighlight.py", line 184, in updateNavigatorLocation nav = api.getNavigatorObject() File "api.py", line 197, in getNavigatorObject obj=globalVars.reviewPosition.NVDAObjectAtStart File "baseObject.py", line 21, in __get__ return self.fget(instance) File "textInfos\offsets.py", line 293, in _get_NVDAObjectAtStart return self._getNVDAObjectFromOffset(self._startOffset) File "virtualBuffers\__init__.py", line 95, in _getNVDAObjectFromOffset return self.obj.getNVDAObjectFromIdentifier(docHandle,ID) File "virtualBuffers\MSHTML.py", line 210, in getNVDAObjectFromIdentifier HTMLNode=NVDAObjects.IAccessible.MSHTML.locateHTMLElementByID(self.rootNVDAObject.HTMLNode.document,'ms__id%d'%ID) File "comtypesMonkeyPatches.py", line 32, in new__getattr__ return old__getattr__(self,name) File "C:\Python27\lib\site-packages\comtypes\client\lazybind.py", line 149, in __getattr__ return self._comobj._invoke(descr.memid, descr.invkind, 0) File "C:\Python27\lib\site-packages\comtypes\automation.py", line 664, in _invoke dp, var, None, argerr) COMError: (-2147417842, '\x83A\x83v\x83\x8a\x83P\x81[\x83V\x83\x87\x83\x93\x82\xcd\x81A\x95\xca\x82\xcc\x83X\x83\x8c\x83b\x83h\x82\xc9\x83}\x81[\x83V\x83\x83\x83\x8a\x83\x93\x83O\x82\xb3\x82\xea\x82\xbd\x83C\x83\x93\x83^\x81[\x83t\x83F\x83C\x83X\x82\xf0\x8c\xc4\x82\xd1\x8fo\x82\xb5\x82\xdc\x82\xb5\x82\xbd\x81B', (None, None, None, 0, None))
本家のアドオンチームが focus highlight の readme.md を書いて正式に公開してくれました。
まだ説明の日本語訳をコミットしてませんが、下記からダウンロードできます。
http://addons.nvda-project.org/addons/focusHighlight.ja.html
今後はこのアドオンの保守は本家のアドオンチームの活動として行います。
本家チケット 971
http://community.nvda-project.org/ticket/971
Focus Highlight アドオンの実装が NVDA 本体に取り込まれる可能性が出てきました。
今後の検討は上記の本家チケットで行います。
コミュニティのアドオンサイトで Focus Highlight は「開発中のアドオン」に分類されているので、「安定版」になっていないという意味で再オープンしました。
http://addons.nvda-project.org/dev.ja.html
アドオン開発のガイドライン
https://bitbucket.org/nvdaaddonteam/todo/raw/master/guideLines.txt
現在 Focus Highlight は NVDA 2013.3 系で IE と併用するとエラーがでる不具合が報告されており、下記の暫定修正を検討中です。
https://bitbucket.org/nishimotz/focushighlight/commits/d30e9de2d58e7e9975122a88403fe7fb1d1287a8
本家アドオンサイトで「安定版」扱いになったので、クローズします。
今後の課題の一つとして、下記のチケットがあります:
NVDA でフォーカス位置をハイライトする機能をどう実装するか調査をしています。
Windows 8 環境で下記のパッチにより、UI オートメーションを使って、フォーカスが変化したときにビープを鳴らす、フォーカス位置の座標をログに書き出す、ということはできました。
参考にしているのは MSDN の「蛍光ペンのサンプル」の C# 実装です。
http://msdn.microsoft.com/ja-jp/library/aa358508%28v=vs.90%29.aspx
引き続き検討します。