WinFormsアプリ(OpenTween)でアクセシビリティを改善しようとしてる話 - Webじゃないアクセシビリティ Advent Calendar 2016 11日目

Webじゃないアクセシビリティ Advent Calendar 2016 の 11 日目の記事です。

また、OpenTween Advent Calendar 2014 の 742 日目の記事でもあります。

OpenTween は、かつてはオープンソースで公開されてゐた*1 WindowsTwitter クライアントである Tweenソースコードを基に派生したプロジェクトです。

OpenTween のユーザーには元々 Tween のユーザーであった人も多く居ますが、その中には PC-Talker や NVDA といったスクリーンリーダーを介して利用する方も含まれてゐます。元となった Tween の画面は Windows Forms (WinForms) によって提供される標準の GUI 部品のみでほぼ構成されてをり、素の状態でも使えるほどにはアクセシブルであったことも要因の様です。

OpenTween でアクセシビリティに関する問題の改善に積極的に取り組む様になったのは2015年10月ごろからです。おそらく以下のコミットが最初の変更ではないかと思ひます。

タブ名の読み上げ対応のためTabPageを使用する箇所でAccessibleRoleを明示 · opentween/OpenTween@f17d2b9 · GitHub

これは、Tween では発言一覧にフォーカスが当たったときにタブ名が読み上げられるが OpenTween では読み上げられない、といった報告を受けて調べたものでした。分かったこととしては、NVDA には Tween.exe 専用の AppModule が用意されており、これによってタブ名の読み上げが実現されて居たことです。そのため、実際に OpenTween.exe を Tween.exe にファイル名を変更して実行してみると確かにタブ名が読み上げられました。以下がその AppModule です。*2

nvdajp/tween.py at release-2015.3jp-150825 · nvdajp/nvdajp · GitHub

この機能を実現してゐるのは 66 行目付近にある obj.role = controlTypes.ROLE_PROPERTYPAGE の部分です。タブの内容となるパネル部分のロールを「プロパティページ」で上書きすることでタブの名前が NVDA で読み上げられる様になります。

この「ロール」は Windows Forms の各コンポーネントに標準で備はる AccessibleRole といふプロパティで変更することができるため、これを使って AppModule と同様の機能を実現したのが最初に書いたコミットでした。

OpenTween で使用してゐる Windows Forms のやうな GUI フレームワークには、アクセシビリティに関するプロパティが標準で提供されてゐることがあります。GitHub を探してもなかなか参考になる例を見つけることは難しいですが、アクセシブルな WinForms アプリを作る一助としてオープンソースである OpenTween が参考になれる様に今後も対応を続けて行きたいなと思ひます。

*1:現在はクローズドソースとなり開発が継続されてゐる

*2:実のところ、この AppModule がタブに対するロール変更以外に何をしてゐるのかよく分かってないので教へてくれる方募集中