■ 英語キーボード設定の OS で日本語キーボードを使うときの情報まとめ


【お知らせ】


<2023/10/15 追記>
レジストリの「Scancode Map」の設定方法について記載している記事がありました。

<2022/06/24 追記>
Fakeymacs でこんな機能を作ったので、本情報を利用することはなくなってしまいました。

<2021/09/10 追記>
某社のリモートアクセスソフトを利用した場合、画面の切替時に仮想キーコード 255 が勝手に発行されていることが分かりました。このため、仮想キーコード 255 を別な仮想キーコードに置き換える処理の採用はやめ、仮想キーコード 255 を発行するキーのスキャンコードを変更する方式に見直しました。



私は普段、デスクトップ PC に英語キーボード(HHKB US)を繋いで使っています。ただし、会社支給のノート PC を使う場合など、日本語キーボードを使う必要もあります。どちらの場合も Fakeymacs の設定を行い使っているので IME の変換キーなどには困っていないのですが、特殊文字の入力になるとよく間違えます。

また、そのノート PC からは 英語キーボードを使っているデスクトップ PC にリモートログインすることがよくあります。ログインした状態のデスクトップ PC にリモートデスクトップで接続すると、その接続中は英語配列のキー操作を求められるため、ノート PC を使っている場合でも日本語配列と英語配列を使い分ける必要があります。(接続先の PC にログインし直せば、キー配列は接続元の PC の配列になりますが、デスクトップ PC を使わないときは画面ロックだけにしていることが多いので、この問題が発生してしまいます。)

そこで、いっそのことノート PC の日本語キーボードを英語キーボードとして使ってしまおうと考え、いろいろ設定方法を調べてみました。以下はその調べたときに分かったことをまとめたものです。

1)調べて分かったこと
  • キーボードのキーにはスキャンコードが割り当てられており、英語配列であっても日本語配列であっても、(おおよその)キーの位置で同じコードが割り当てられている。(例えば、英語配列の <]> キーと、日本語配列の <[> キーは同じ位置にあるため、同じスキャンコードのキーとなっている。)
  • スキャンコードは、キーボードのデバイスドライバによって仮想キーコードに変換される。そして Keyhac では、この仮想キーコードを利用して設定を行うことができる。
  • スキャンコードから仮想キーコードへの変換は、キーボードのデバイスドライバの種類によって一部異なる。キーボードの配置の異なるキーやキーボードに存在しないキー(例えば、英語キーボードには <無変換> キーや <変換> キーが存在しない)が別な仮想キーコードに割り当てられる。
  • 英語キーボードのデバイスドライバでは、英語キーボード上には無いけれども日本キーボード上に有るキー( <変換> キーや <カタカナひらがな> キー、<¥> キーなど)が押されると、255 番の仮想キーコードに変換される。ただし、<無変換> キーや <\> キーのように 255 番以外の仮想キーコードに変換されるものもある。
  • OS のレジストリの設定により、入力されたスキャンコードを別のスキャンコードに変換することができる。デバイスドライバが 255 番以外の仮想キーコードに変換可能なスキャンコードを割り当てると、一意のキーとして利用できるようになる。(例えば、スキャンコード 0x7F をキーに割り当てると、仮想キーコード 236(VK_OEM_PA2)を発行するキーとして利用できる。スキャンコードの変更は、Change Key を使うのが便利。KeySwap は、変換先のキーをスキャンコード(数値)で指定することができない。)
  • リモートデスクトップの接続先には、接続元のキーボードからスキャンコードが送信される。このため、接続元の OS の設定が英語キーボードになっていても日本語キーボードになっていても、送られるスキャンコードに違いはない。
  • リモートデスクトップの接続先に新たにログインする場合、接続先では接続元の OS のキーボード設定が採用される。
  • リモートデスクトップの接続先がログイン済みの場合、接続先では利用しているキーボードの設定は変更とはならない。(接続先の PC でログインしたものであれば、接続先の OS のキーボード設定が有効となっている。)
  • リモートデスクトップで接続した場合、レジストリによるキーボードのスキャンコードの置き換えは接続元の設定が有効になり、接続先の設定は有効にならない。

2)日本語キーボード設定にした OS に日本語キーボードを接続した場合のキーの出力状況(入力したキーの確認は、Keymill というソフトウェアを使うと便利。http://kts.sakaiweb.com/keymill.html
  • <半角/全角> キーはスキャンコード 0x29 で、仮想キーコード 243(VK_OEM_AUTO)、244(VK_OEM_ENLW)、25(VK_KANJI、Alt と押したとき)に変換される。
  • <無変換> キーはスキャンコード 0x7B で、仮想キーコード 29(VK_NONCONVERT)に変換される。
  • <変換> キーはスキャンコード 0x79 で、仮想キーコード 28(VK_CONVERT)に変換される。
  • <カタカナひらがな> キーはスキャンコード 0x70 で、仮想キーコード 242(VK_OEM_COPY)、仮想キーコード 241(VK_OEM_FINISH、Shift と押したとき)、仮想キーコード 245(VK_OEM_BACKTAB、Alt と押したとき)、仮想キーコード 246(VK_ATTN、Alt と押したとき)に変換される。
  • <¥> キーはスキャンコード 0x7D で、仮想キーコード 220(VK_OEM_5)に変換される。
  • <]> キーはスキャンコード 0x2B で、仮想キーコード 221(VK_OEM_6)に変換される。
  • <\> キーはスキャンコード 0x73 で、仮想キーコード 226(VK_OEM_102)に変換される。

3)英語キーボード設定にした OS に日本語キーボードを接続した場合のキーの出力状況
  • <半角/全角> キーはスキャンコード 0x29 で、仮想キーコード 192(VK_OEM_3)に変換される。
  • <無変換> キーはスキャンコード 0x7B で、仮想キーコード 235(VK_OEM_PA1)に変換される。
  • <変換> キーはスキャンコード 0x79 で、仮想キーコード 255(定義名なし)に変換される。
  • <カタカナひらがな> キーはスキャンコード 0x70 で、仮想キーコード 255(定義名なし)に変換される。
  • <¥> キーはスキャンコード 0x7D で、仮想キーコード 255(定義名なし)に変換される。
  • <]> キーはスキャンコード 0x2B で、仮想キーコード 220(VK_OEM_5)に変換される。
  • <\> キーはスキャンコード 0x73 で、仮想キーコード 193(VK_ABNT_C1)に変換される。
  • Change Key で適当なキーにスキャンコード 0x7F を割り当てると、仮想キーコード 236(VK_OEM_PA2)を発行するキーとなる。(仮想キーコード 255 を吐くキーに割り当てし直すスキャンコードとして利用できる。)
  • Change Key で適当なキーにスキャンコード 0x6F を割り当てると、仮想キーコード 237(VK_OEM_PA3)を発行するキーとなる。(仮想キーコード 255 を吐くキーに割り当てし直すスキャンコードとして利用できる。)

4)英語キーボード設定にした OS に日本語キーボードを接続して使う場合の Keyhac での対応方針(上記の1と2の結果より)
  • <半角/全角> キーは <`> キーに置き換えられるので、それを使う。(何もしない。)
  • <無変換> キーが発行する仮想キーコード 235 を仮想キーコード 29(VK_NONCONVERT)に置き換える。
  • <]> キーが発行する仮想キーコード 220(VK_OEM_5、BackSlash キー)を仮想キーコード 13(VK_RETURN、Return キー)に置き換える。(Enter キーをより近い位置で利用するため。)
  • <\> キーが発行する仮想キーコード 193(VK_ABNT_C1)を仮想キーコード 161(VK_RSHIFT、RShift キー)に置き換える。(RShift キーをより近い位置で利用するため。)
  • Change Key を使って、<変換> キーにスキャンコード 0x7F を割り当てる。(仮想キーコード 236(VK_OEM_PA2)を発行するキーとなる。)そして、<変換> キーが発行するようになった仮想キーコード 236(VK_OEM_PA2)を仮想キーコード 28(VK_CONVERT)に置き換える。
  • Change Key を使って、<¥> キーにスキャンコード 0x6F を割り当てる。(仮想キーコード 237(VK_OEM_PA3)を発行するキーとなる。)そして、<¥> キーが発行するようになった仮想キーコード 237(VK_OEM_PA3)を仮想キーコード 220(VK_OEM_5、BackSlash キー)に置き換える。
以上の対応方針に基づく Keyhac の設定(config.py)は次のとおりとなります。
from keyhac import *

def configure(keymap):
    keymap.replaceKey(235, 29)               # <無変換> キーを OS が認識可能なキーにする
    keymap.replaceKey(236, 28)               # <変換> キーを OS が認識可能なキーにする
    keymap.replaceKey(193, "RShift")         # <\> キーを RShift キーにする
    keymap.replaceKey(237, "BackSlash")      # <¥> キーを BackSlash キーにする
    keymap.replaceKey("BackSlash", "Return") # <]> キーを Enter キーにする
また、Fakeymacs の拡張機能としても作成しています。

最後に、Change Key による設定結果もキャプチャしましたので表示しておきます。(Ctrl の置き換えは、CapsLock に 右Ctrl を配置する方法もあります。以下の設定は、HHKB を繋いで利用している PC にリモートデスクトップで接続することを想定した、接続元 PC の設定例となります。)

最終更新:2023年10月15日 10:31
添付ファイル