Ticket #33555

Winbiff メール内容の読み上げの不具合

Open Date: 2014-03-22 21:57 Last Update: 2014-05-11 22:31

Reporter: nishimoto Owner: nishimoto
Type: Bugs Status: Closed
Component: コア機能 MileStone: 2014.2jp (closed)
Priority: 5 - Medium Severity: 5 - Medium
Resolution: Fixed

Details

NVDA 2014.1jp にバージョンアップしたら Winbiff の読み上げに不具合が発生したというご報告をいただきました。

私の環境 Windows 8.1 64ビットで現在ダウンロード可能な Winbiff without EditX Version 2.51 PL2 を使ってみました。

確かに表示されている改行位置と読み上げの改行位置が一致しない不具合が出ています。

2013.3jp に戻すと解決するというご指摘をいただいているので、下記の変更の影響という可能性もあります。

チケット #33260 Visual Basic 6 アプリケーションの複数行エディットで改行位置が正しく認識されない

Winbiff そのものはすでにサポートが終了したアプリケーションなのですが、他のアプリケーションにも不具合が出ているかも知れないので、引き続き検討させてください。

Attachment File List

No attachments

Ticket History (3/10 Histories)

2014-03-22 21:57 Updated by: nishimoto
  • New Ticket "Winbiff メール内容の読み上げの不具合" created
2014-03-22 23:18 Updated by: nishimoto
  • Resolution Update from None to Accepted
Comment

2014.1jp の修正版 (2014.1jp2) をリリースするかも知れないので、jp2014.1 ブランチで以下の作業を行いました。

[jp2014.1 09ea070] work around issue with Winbiff (nvdajp ti33555)
 2 files changed, 8 insertions(+), 2 deletions(-)

検証したところ Winbiff と Visual Basic 6 テストアプリケーションの違いは editAPIVersion なので、editAPIVersion が 0 で Unicode ウィンドウでない場合にだけ、本件の不具合回避を実行するように変更しました。

不具合修正をカバーできないケースが発生するかも知れませんが、検証対象のアプリがいまのところ2種類しかないので、副作用を最小限にすることを狙っています。

また NVDA の設定ファイルに下記のオプションを追加して workAroundEncoding を false にすると、editAPIVersion に関わらず チケット #33260 の修正を無効にできるようにしました。

[language]
	workAroundEncoding = boolean(default=true)

修正版をリリースしなおすか、2014.2jp までこの修正を見送るか、ご意見をいただければ幸いです。

2014-03-22 23:30 Updated by: nishimoto
Comment

2014.1jp に本件に関する修正だけを加えたテスト版 jpbeta140322 を作りました。

https://dl.dropboxusercontent.com/u/62564469/nvda_jpbeta140322.exe

電子署名はしていません。

私の環境では Winbiff は正常に動くようになりましたが、特に日本で開発された複数行エディットを使うアプリケーションでのテスト報告を歓迎します。

2014-03-23 09:33 Updated by: nishimoto
Comment

チケット #33260 の修正を有効にするかしないか(EM_GETSELなどがバイト単位と文字数単位のどちらで動作しているか)の判定を単純に行うことが難しそうです。

マイクロソフトの情報:

WindowsXP で Manifest ファイルを使用したアプリケーションで Common Control バージョン 6 を使用した場合、Edit コントロールへの EM_LIMITTEXT メッセージによる入力量制限を設定する際の単位が、バイト数単位ではなく文字数単位に変更されました。この動作は仕様です。

http://support.microsoft.com/kb/418099/ja

単純に上記の条件を判定すればいいのかと思ったのですが

  • Dependency Walker によると VB6 テストアプリも Winbiff も comctl32 の 5.x と 6.x の両方を参照している
  • Winbiff がインストールされたフォルダに Manifest ファイルがない

という状況なので、この問題を正しく処理するにはもうすこし情報収集する必要があります。

方針案:

  • 現状で VB6 テストアプリと Winbiff の振り分けができているので、これを暫定修正版としてリリースする
  • Winbiff のほかに致命的な不具合を生じるアプリケーションが見つかるまでもう少し不具合報告を待つ
  • もともと本家が技術的に困難として後回しにしたバグだったので、日本語版で独自に行った修正をいったん撤回する
  • ユーザーに明示的にこの不具合回避の有効、無効の選択をしてもらえるようにNVDAメニューに設定項目をつける(アプリケーションごとに設定プロファイルで切り替えてもらう)

本家が技術的に困難としたのはスレッドのロケールを RPC で取得する必要がある、という話で、ここで書いているコモンコントロールのバージョンと環境に依存する話はまた別件です。

日本語チーム以上に本家から手を出しにくい(情報収集がしにくい)バグではないかとも思われます。

2014-03-23 13:23 Updated by: nishimoto
Comment

jpbeta140322 で Winbiff の不具合が解決したというご報告をいただきました。

ただ、editAPIVersion による判定(実質的にウィンドウクラスの種類による振り分け)ではきちんと問題は解決できないようです。

この「ANSI 版エディットボックスの Unicode 動作」について、後述のいくつかの記事のように、アプリ開発者はこの環境依存の問題を、実際に CreateWindowA を実行して EM_SETSEL, EM_GETSEL の結果を見て判断する、といった実装をしているようです。 この方法は NVDA の実装方法としては参考になりません。

ANSI 版エディットボックスが Unicode 動作していれば IsWindowUnicode で判断できるという情報もあるので Winbiff について IsWindowUnicode を正しく取得できていない(エディットボックスそのもののハンドルを正しく使えていない)のかも知れません。

「ANSI 版エディットボックスの Unicode 動作」を判断する正しい方法がないとすると、

  • NVDA の設定でユーザーが選択できるようにする(まず設定プロファイルで個別に対応してもらう)
  • アプリケーションモジュールでアプリケーションやコントロールごとに切り替える

といったアプローチが考えられます。

最終的には EM_GETSEL などを使わないで edit.py を実装するように本家の実装をやり直す必要があるかも知れません。

以下、「ビジュアルスタイル ANSI 版エディットボックスの Unicode 動作」に関する記事:

2014-03-23 13:50 Updated by: nishimoto
Comment

ダウンロードページ 2014.1jp のリリースノートに、本件を既知の不具合として記載しました。

https://sourceforge.jp/projects/nvdajp/releases/60796/note

2014-03-24 00:07 Updated by: nishimoto
Comment

2014.1jp を再修正したテスト版 jpbeta140324 を作りました。

https://dl.dropboxusercontent.com/u/62564469/nvda_jpbeta140324.exe

「日本語設定」に「改行位置の不具合対策」というチェックボックスを追加しました。

デフォルトでは有効で、ANSI 版エディットボックスで本家版の不具合を回避します。

ただし Winbiff のように「ANSI 版エディットボックスの Unicode 動作」では、不必要な処理を避けるためにチェックを外していただくことになります。

前述の記事によると実行環境の Windows のバージョンにも依存する可能性があるらしく、この対策の必要・不必要の判定は困難そうなので、このような実装が現状では安全と考えました。

2014-04-14 20:54 Updated by: nishimoto
2014-05-02 12:22 Updated by: nishimoto
  • Owner Update from (None) to nishimoto
  • Component Update from (None) to コア機能
2014-05-11 22:31 Updated by: nishimoto
  • Ticket Close date is changed to 2014-05-11 22:31
  • Status Update from Open to Closed
  • Resolution Update from Accepted to Fixed
Comment

本作業は完了と判断して、クローズします。

Edit

Please login to add comment to this ticket » Login