Mac からのRDP 接続で日本語キーボードを設定する

## はじめに

Mac から Windows へ RDP でリモートデスクトップ接続した時にJISキーボードがUS配列にセットされ、日本語入力できないことが多々あります。
このエントリでは RDP 接続時のキーマッピングの仕組みと日本語入力を快適に行うための設定について解説します。

【追記 2021/02/08】 Big Sur 標準IMEからのRDP接続だとUSキーボードになってしまうようです (汗)
おそらくParallels Client側で修正してもらう必要があると思いますので、最新版にアップデートして、環境情報と再現手順をフィードバック (できれば英語で ^^;) して頂けると対応してもらえる可能性が高くなると思われます。
https://apps.apple.com/jp/app/parallels-client/id600925318?mt=12#see-all/reviews

【追記 2022/05/22】↑上記の問題は2021年7月頃にリリースされました Parallels Client v18.1.22708 で修正済みのようです！

## なぜ US 配列になるのか？

考えられる原因は２つあります。

- 一つ目はサーバー側のキーボードドライバーが 英語 101/102 になっている場合です。通常日本語OSとしてインストールした場合には日本語 106/109 がインストールされますが、AWS や Azure のインスタンスなど 英語OS + 日本語言語パックとして提供されたものは、英語 101/102 のドライバーがインストールされている可能性があります。
現在インストールされているキーボードドライバーを確認するには管理者権限で次のコマンドを実行します。

      dism /online /get-intl

キーボード レイヤード ドライバーとして 日本語キーボード (106/109 キー) 以外の値が表示される場合には、[Microsoft の記事](https://support.microsoft.com/ja-jp/help/927824/) を参照してレジストリキーを変更し、日本語キーボードドライバーをロードするために OS を再起動します。

      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters

|Value name|Value type|Value data|
|:----:|:----:|:----:|
|LayerDriver JPN|REG_SZ|kbd106.dll|
|OverrideKeyboardIdentifier|REG_SZ|PCAT_106KEY|
|OverrideKeyboardSubtype|DWORD|2|
|OverrideKeyboardType|DWORD|7|

サーバー側が Windows 10 または Windows Server 2016 の場合には、[こちらの方法](http://hirogura.com/2016/07/26/post-3536/) でも変更できます。

- US配列がマップされるもう一つの原因は、クライアント側の Keyboard Type が英語となっている場合です。サーバー側のキーボードドライバーが日本語106/109となっているにも関わらずUS配列がマップされる場合には、クライアント側の設定を見直す必要があります。

そのためRDP接続におけるキーマッピングの仕組みについて説明します。

## RDP接続におけるキーマッピングの仕組み

RDPクライアントは、新規のRDP接続時に現在アクティブになっている入力ソース (IME) の情報をサーバー側に送り、RDPセッション内でマップしようとします。RDPクライアントが送るクライアント側のキーボード関連のパラメーターは下記のようなものがあります。

- keyboardLayout
- keyboardType
- keyboardSubType
- keyboardFunctionKey
- imeFileName

このうちkeyboardTypeが原因となり、Mac からの RDP 接続でUS配列がマップされる問題が発生する場合が多いようです。
keyboardTypeの定義は [RDPの仕様書](https://msdn.microsoft.com/en-us/library/cc240445.aspx) に記載されています。現在主に使用されているのは **4 (英語 101/102)** と **7 (日本語106/109)** です。

|keyboardType|Meaning|
|:--------:|:-------:|
|0x00000001|IBM PC/XT or compatible (83-key) keyboard|
|0x00000002|Olivetti "ICO" (102-key) keyboard|
|0x00000003|IBM PC/AT (84-key) and similar keyboards|
|**0x00000004**|**IBM enhanced (101-key or 102-key) keyboard**|
|0x00000005|Nokia 1050 and similar keyboards|
|0x00000006|Nokia 9140 and similar keyboards|
|**0x00000007**|**Japanese keyboard**|

またkeyboardType以外の詳細についても仕様書に説明がありますので、ご興味のある方はご参照ください。

## keyboardType の確認手順

RDPセッション開始時にサーバー側にどのようなパラメーターが送られているかは Wireshark でパケットをキャプチャすることにより確認することができます。

[Download Wireshark](https://www.wireshark.org/download.html) から macOS 版をダウンロードし、インストールします。

Wiresharkでパケットキャプチャを開始した上で、RDP接続を行います。
パケットを **rdp** でフィルターし、Info が **ClientData** となっているパケットを探し出し、展開します。

![RDP_keyboardType.png](https://qiita-image-store.s3.amazonaws.com/0/178312/9a013623-22e9-1faf-9b8d-c0bf01e89027.png)

**keyboardType=7** が送信されていれば日本語入力がRDPセッションでマップされるはずです。
**keyboardType=4** となっている場合、クライアント側のアクティブなキーボードが英語としてサーバーへ送信されているためUS配列がマップされてしまいます。
その場合は **一旦RDPセッションからログオフし、Mac 側で [かな] キーを押下し日本語をアクティブな入力ソースにセットした上で** RDP接続を行います。
RDPセッションから切断した状態で再接続した場合には、ClientDataが送信されないためクライアント側の新しい入力ソースがRDPセッションで認識されません。
またGoogle 日本語入力や ATOK を使用している場合は、Mac純正の日本語入力も試してみます。
それでも **keyboardType=4** が送られてしまう場合には、いろいろなRDPクライアントを試してみます。

## RDPクライアントの選択肢

Macで使用できる無償のRDPクライアントは下記のようなものがあります。

1. [Microsoft Remote Desktop](https://apps.apple.com/jp/app/microsoft-remote-desktop/id1295203466?mt=12)
    言わずと知れた Microsoft 純正の RDP クライアント。Mac App Storeから入手可能です。
    Microsoft Remote Desktop version 8.0.38 (build 27253) + macOS 10.12.4 で試した結果は次の通りです。接続先は Windows 10 64bit (Creators Update 適用済み) です。

    |入力ソース|keyboardType|
    |:----:|:---------:|
    |Mac純正日本語入力|4|
    |Google日本語入力|4|
    |ATOK|4|

    いずれも英語キーボードがマップされてしまいました。

2. [Microsoft Remote Desktop (Beta)](https://rink.hockeyapp.net/apps/5e0c144289a51fca2d3bfa39ce7f2b06/)
    ~~上記のものとの棲み分けが不明ですが、こちらも Microsoft が提供しています。Mac App Storeからは入手できないため上記のリンクから直接ダウンロードします。~~
    ~~Microsoft Remote Desktop (Beta)を使えば日本語入力が可能になるという報告がありますが、私が Microsoft Remote Desktop (Beta) version 8.2.31 (build 750) + macOS 10.12.4 で試した結果は次の通りです。~~

    |入力ソース|keyboardType|
    |:----:|:---------:|
    |Mac純正日本語入力|4|
    |Google日本語入力|4|
    |ATOK|4|

    ~~"Beta" を使用した場合でも、英語キーボードがマップされてしまいました。~~

    ↑こちらは現在入手不可となったようです。


3. [Parallels Client](https://apps.apple.com/jp/app/parallels-client/id600925318?mt=12)
    Parallels Remote Application Server (RAS) と呼ばれるリモートアクセス製品の一部として提供されています。Mac App Storeから入手可能です。RASというのは一種のRDPブローカーの製品ですが、RASがなくても標準のRDP接続を設定することもできます。

    余談になりますが、Parallelsと言えば Parallels Desktop という Mac での仮想化製品が有名ですが、2015年2月25日に [2X Softwareを買収して](https://www.parallels.com/jp/news/parallels-acquires-2x-software-feb-25-2015/) 中小企業向けの仮想アプリケーションのソリューションとして製品のポートフォリオに組み込んでいるようです。
    ひょっとした2X時代のRDPクライアントを使用していた方もいらっしゃるかもしれません。

    Parallels ClientでRDP接続するには、接続を追加し、接続タイプとして **標準RDP** を選択します。
    Parallels Clientを使用してリモートアクセスした場合、いずれの日本語入力でも **keyboardType=7** が送信され、RDPセッションで日本語 106/109 キーボードがマップされました。

    |入力ソース|keyboardType|
    |:----:|:---------:|
    |Mac純正日本語入力|7|
    |Google日本語入力|7|
    |ATOK|7|

## かなキー・英数キーによる日本語切り替え

RDPセッションで日本語 106/109 キーボードがマップされた次の段階として、英数 <=> ひらがなの切り替えがスムーズに行えるように設定します。
Windows では半角/全角キーで IME オン/オフを切り替えますが、Mac では通常 **かなキーでIMEオン**、**英数キーでIMEオフ** に切り替えます。

RDPセッション内で、Macのかなキー・英数キーで日本語切り替えができない場合、リモート接続先の Windows で次の設定を行います。

    言語バー > ツール > プロパティ > [詳細設定] ボタン > 編集操作 カテゴリ > [変更] ボタン


### かなキーでIMEオンにならない場合
- キーとして「ひらがな」の行、「入力/変換済み文字なし」の列をダブルクリックし、「IME-オン」を選択してOKをクリックします。

### 英数キーでIMEオフにならない場合
- キーとして「無変換」の行、「入力/変換済み文字なし」の列をダブルクリックし、「IME-オフ」を選択してOKをクリックします。

この設定により、Macのかなキー・英数キーにより日本語の切り替えができるようになります。