この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2012年7月)

2012年7月26日

Bug-org 773651 on windows XP KeyboardEvent.location for CTRL keys is always set to DOM_KEY_LOCATION_LEFT
初回投稿日時: 2012年07月26日10時41分21秒
カテゴリ: Mozilla Core Mozilla17 Windows バグ修正
SNS: (list)

Windows XP(と、Windows Server 2003)では、Ctrlキーや、Altキーを押したときに、常にKeyboardEvent.locationに、KeyboardEvent.DOM_KEY_LOCATION_LEFTがセットされているというバグです。

原因はMapVirtualKeyEx() APIはVista以降で完璧に動くようになったのを失念してのミスでした。

Windowsでは物理キーの情報は、scan codeの値と、extended keyであるか否か、この二つの情報から判断しなくてはいけません。一般的なキーボードの、矢印キー、Insert等の六個のキー、そして右Ctrlと、右Altキーがextended keyです。

Windowsのキーメッセージは、左右の区別のつかない、VK_CONTROLと、VK_MENUで通知されるので、KeyboardEvent.locationの実装のためには、MapVirtualKeyEx() APIを利用して、キーメッセージで同時に通知されている、scan codeと、extended keyか否かの情報から、VK_LCONTROLVK_RCONTROLVK_LMENUVK_RMENUという、左右の区別がつく仮想キーコードに変換しなくてはいけません。しかし、Vistaより古いWindowsでは、extended keyのscan codeであるという情報を、このAPIに指定することができないので、普通に呼び出しても、うまくいかないのです。

厳密に調べる方法は簡単にはいかないので、Windows XPの場合は、シンプルに、extended keyであるか否かの情報から、左右を決め打ちするように修正しました。実際にはもうちょっと、想定しない動作にならないように、また、SendMessage()や、PostMessage()でフェイクのキーメッセージが送られてきた場合にも備えて、いくつかの安全装置を入れてあります。

関連するかもしれないエントリ

bug-org 773651を含むエントリ