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:
Tweet (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_LCONTROL、VK_RCONTROL、VK_LMENU、VK_RMENUという、左右の区別がつく仮想キーコードに変換しなくてはいけません。しかし、Vistaより古いWindowsでは、extended keyのscan codeであるという情報を、このAPIに指定することができないので、普通に呼び出しても、うまくいかないのです。
厳密に調べる方法は簡単にはいかないので、Windows XPの場合は、シンプルに、extended keyであるか否かの情報から、左右を決め打ちするように修正しました。実際にはもうちょっと、想定しない動作にならないように、また、SendMessage()や、PostMessage()でフェイクのキーメッセージが送られてきた場合にも備えて、いくつかの安全装置を入れてあります。