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()
でフェイクのキーメッセージが送られてきた場合にも備えて、いくつかの安全装置を入れてあります。