4K モニターで Logitech Tap を使うと Zoom Rooms アプリの解像度がおかしいやつを直す

すごいニッチな内容だと思われるのだが、Logitech（ロジクール）のサポートが💩すぎたのでストレス解消に書く。

Zoom Rooms というテレビ会議システムがある。
https://zoom.us/zoomrooms
Zoom 社は各プラットフォーム用のソフトウェアと Web サービスを作ってる。
Logitech が Zoom Rooms 用のカメラとかマイクとか PC とかのセットを売ってる。
https://www.logicool.co.jp/ja-jp/room-solutions

Logitech の Zoom Rooms 用会議室ソリューションは Zoom Rooms 用のアプリケーションなどがセットアップ済みで、Windows の初期設定を済ませればすぐに Zoom Rooms アプリが立ち上がるようにできてる。（逆に Zoom Rooms 以外のことができないように制限されている。）

会議室ソリューションには Tap と呼ばれるタブレットっぽい端末が含まれている。メインモニターでフルスクリーンでテレビ会議が行われるので、この Tap 側の画面でカメラやマイクの調整・参加者の追加などの Zoom Rooms アプリのコントロールをする。

Windows デバイス的にはこれは外部モニター扱いになっていて、メインモニターと合わせてデュアルモニター環境として認識されている。

で、ここでメインモニターが 4K だと問題が起こる。

<img width="1773" alt="Pasted_Image_2020_02_18_16_06.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2595/5e8f2412-9ada-f73a-029f-d105fa948838.jpeg">

右側が Tap を接続せずに起動した状態。左側が Tap を接続して起動した状態。Tap を接続したままだと明らかに解像度が低くなっている（ように見える）。Tap を接続せずに起動して、Zoom Rooms アプリが立ち上がってから Tap を接続してもハッキリクッキリ 4K に見える。あくまで Tap を接続したまま Windows を起動すると解像度がおかしい。

これはどうも 4K モニターと Tap の組み合わせのときだけ、↓の表示スケールが 300% になるかららしい。ディスプレイの解像度自体はちゃんと 4K として認識されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2595/d911fc99-c750-c7a8-ad20-45f616ac6fea.png)

表示スケール変えるだけなら簡単・・・と思うやん？ でも、この PC は Zoom Rooms アプリ専用にカスタマイズされていて Explorer が立ち上がりません。デスクトップがないのです。

で、Logitech が送ってきたのがデフォルトシェルを変えるスクリプト（バグあり）

```powershell
##########################
.SYNOPSIS This script will change the shell of a user from invalid.exe to explorer.exe and swap back
.DESCRIPTION This tool should only be used for a Logitech imaged Zoom room. Running this script on a different system could have an undesriable outcome.
    1. Log off the Zoom user account
    2. Logon with the ZoomAdmin account
    3. Run this Script
    4. Log Off the ZoomAdmin account
    5. Logon with the Zoom account
    6. Once Zoom Rooms start click on the Option button and then exit
    7. Make any changes you desire
    8. Log off the Zoom user account
    9. Log back on as the ZoomAdmin
    10. Run the script again
    11. Log off the ZoomAdmin
    12. Log back on as Zoom account    
    You will need to enable running scripts on the system.
    Open PowerShell with elevated permmisions and run Set-ExecutionPolicy -ExecutionPolicy Unrestricted
    Alternatly you can run this command from an elevated command prompt: PowerShell.exe -executionPolicy ByPass -File SetShell.ps1 -ZoomUser Zoom
.Parameter ZoomUser: The username of the account to be changed. It should be simply Zoom. Or in the case of a domain account domainname\username
.EXAMPLE
    SetShell.ps1 -ZoomUser Zoom
##########################>

Param (
    [Parameter (Mandatory = $True,
        ValueFromPipeline = $False,
        Position = 0)]
    [String[]]
    $ZoomUser
)
function Get-SID($AccountName) {
    $NTUserObject = New-Object System.Security.Principal.NTAccount($AccountName)
    $NTUserSID = $NTUserObject.Translate([System.Security.Principal.SecurityIdentifier])
    return $NTUserSID.Value
}

$ZoomUser = Get-Sid $ZoomUser
$regkey = 'HKLM:\SOFTWARE\Microsoft\Windows Embedded\Shell Launcher\' + $ZoomUser

#Get the registry Key for the user
try {$currentShell = Get-ItemPropertyValue $regkey -Name "Shell" -ErrorAction Stop}
catch {
    write-host "Error finding current shell"
    Exit
}

If ($CurrentShell) {
    #Switch The Shell
    Switch ($CurrentShell) {
        "Invalid.exe" {
            try {
            Set-ItemProperty $regkey -Name "Shell" -Value "Explorer.exe" -ErrorAction Stop
            Write-Output "Shell Set to Explorer"
             }
            catch { Write-Output "Error setting Shell" }
        }
        "Explorer.exe" {
            try { 
            Set-ItemProperty $regkey -Name "Shell" -Value "Invalid.exe" -ErrorAction Stop
            Write-Output "Shell Set to Invalid.exe"}
            catch { Write-Output "Error setting Shell" }
        }
        default {
            write-output "No Shell Set"
        }
    }
}
```

バグってて意図通りに全然動かないので直しました。

```patch
@@ -35,7 +35,9 @@ function Get-SID($AccountName) {
 }
 
 $ZoomUser = Get-Sid $ZoomUser
+write-host "ZoomUser = " $ZoomUser
 $regkey = 'HKLM:\SOFTWARE\Microsoft\Windows Embedded\Shell Launcher\' + $ZoomUser
+write-host "regkey = " $regkey
 
 #Get the registry Key for the user
 try {$currentShell = Get-ItemPropertyValue $regkey -Name "Shell" -ErrorAction Stop}
@@ -43,11 +45,13 @@ catch {
     write-host "Error finding current shell"
     Exit
 }
+write-host "currentShell = " $currentShell
+$currentShell = [System.IO.Path]::GetFileName($currentShell)
 
-If ($CurrentShell) {
+If ($currentShell) {
     #Switch The Shell
-    Switch ($CurrentShell) {
-        "Invalid.exe" {
+    Switch ($currentShell) {
+        "zrshell.exe" {
             try {
             Set-ItemProperty $regkey -Name "Shell" -Value "Explorer.exe" -ErrorAction Stop
             Write-Output "Shell Set to Explorer"
@@ -56,8 +60,8 @@ If ($CurrentShell) {
         }
         "Explorer.exe" {
             try { 
-            Set-ItemProperty $regkey -Name "Shell" -Value "Invalid.exe" -ErrorAction Stop
-            Write-Output "Shell Set to Invalid.exe"}
+            Set-ItemProperty $regkey -Name "Shell" -Value "C:\Program Files (x86)\ZoomRooms\shell\zrshell.exe" -ErrorAction Stop
+            Write-Output "Shell Set to zrshell.exe"}
             catch { Write-Output "Error setting Shell" }
         }
         default {
@@ -65,6 +69,3 @@ If ($CurrentShell) {
         }
     }
 }
```

- Example 間違ってる（`SetShell.ps1` って何）
- 変数名大文字小文字統一してない
- デフォルトで設定されてるシェル実行ファイル名間違ってる（`Invalid.exe` って何）
- シェルがフルパスで設定されてるの考慮してない（Get, Set ともに）

修正後のはこちらで。
https://gist.github.com/Saqoosha/7e6a2fa3644fa06f3d95cbb979528d47


# まとめ

- Logicool サポートに日本語で連絡したら、意味のわからない日本語で返してきたので英語でやりとりした。（日本語で受け付けるならちゃんと日本語できる人用意しろ。）
- Logitech は 4K 対応製品を販売してるにもかかわらず、検証環境に 4K モニタがない（ないから検証できないって何回も言われた。いまどき 4K なんて珍しくないんだから用意しろ。）
- Zoom は悪くない（たぶん） （Zoom Rooms は便利）
- Zoom Rooms やるなら自分で PC と iPad 揃えたほうが安定する（たぶん）
- 書くのにいろいろ思い出したら、ストレス解消どころかよけい腹たってきた😇