仮想デスクトップはいらない？ 〜 ショートカットキーの設定が悪かった

追記: Windows 11 に対応 (2022-06-11)

## 仮想デスクトップを使えばマルチディスプレイができるけれど…

Windows の仮想デスクトップを使うと、マルチディスプレイでできることと同様のことが 1つのディスプレイでできるようになります。

たとえば、プログラムの開発環境の画面と、参考にする資料を表示する画面といった構成にすることができます。

<img width="90%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/9161b3e5-a0f3-a087-baea-d868c0af6442.jpeg"/>

ただ、 __既定では仮想デスクトップを切り替える操作が難しい__ という問題があります。数か所をクリックする、または 3つのキーを同時に押さなければなりません。これではパタパタ切り替えられず、マルチディスプレイのように使うことはできません。

そこで、マウスの中ボタンだけで切り替えるようにしたところ劇的に便利になったので、その設定方法を紹介します。


## マウスの中ボタンだけで仮想デスクトップを切り替える方法

仮想デスクトップを切り替えるボタンをマウスの中ボタンだけにカスタマイズするには、中ボタンを「Windows キーと Ctrl キーと右または左のカーソルキーの 3つのキーを同時に押すこと」にマッピングさせることです。なお、ここで紹介する方法は、AutoHotkey のインストールが必要になります。

### AutoHotkey をインストールします

- https://www.autohotkey.com/download/ >> Download AutoHotkey Installer
- ダウンロードしたファイル（例：AutoHotkey_1.1.33.10_setup.exe）を開きます
- Express Installation
- Exit

ちなみに、 https://www.autohotkey.com/ の Is It Safe? をクリックするとノートンのサイトに移動して安全性のチェック結果が表示されます。 norton.com はオレオレサイトではないので信頼できるでしょう。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/cacd84e4-47c8-97c7-3c18-21b86250915c.jpeg"/>



### AutoHotkey.ahk ファイルを作ります

デスクトップなどに AutoHotkey.ahk ファイルを新規作成します:

- デスクトップなどを右クリック >> 新規作成 >> AutoHotkey Script >>（ファイル名を変更）

AutoHotkey.ahk ファイルをメモ帳で開きます:

- AutoHotkey.ahk ファイルを右クリック >> Edit Script

下記の内容をファイルにコピーして「保存」します:

    MButton::
        SpecialDesktopNum := 2
        SpecialDesktopIndex := SpecialDesktopNum - 1
        ProcessID := DllCall("GetCurrentProcessId", "UInt")
        DllCall("ProcessIdToSessionId", "UInt", ProcessID, "UInt*", SessionID)
        RegRead, CurrentDesktopID, HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SessionInfo\%SessionID%\VirtualDesktops, CurrentVirtualDesktop
        RegRead, DesktopIDs, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VirtualDesktops, VirtualDesktopIDs
        DesktopIdLength := StrLen(CurrentDesktopID)
        IsSpecialDesktop := false
        If (StrLen(DesktopIDs) >= SpecialDesktopIndex * DesktopIdLength) {
            SpecialDesktopID := SubStr(DesktopIDs, SpecialDesktopIndex * DesktopIdLength + 1, DesktopIdLength)

            If (CurrentDesktopID == SpecialDesktopID) {
                IsSpecialDesktop := true
            }
        }

        If (IsSpecialDesktop) {
            SendEvent {LWin down}{LCtrl down}{Left  down}{LWin up}{LCtrl up}{Right up}
        } Else {
            SendEvent {LWin down}{LCtrl down}{Right down}{LWin up}{LCtrl up}{Right up}
        }
        return

    WheelLeft::
        SendEvent {LWin down}{LCtrl down}{Left  down}{LWin up}{LCtrl up}{Right up}
        return

    WheelRight::
        SendEvent {LWin down}{LCtrl down}{Right down}{LWin up}{LCtrl up}{Right up}
        return

Windows 11 の場合、上記のコードの一部を変更してください。レジストリ`____\Explorer\SessionInfo\%SessionID%\VirtualDesktops` が`____\Explorer\VirtualDesktops` に変わったことに対応するためです。

変更前:

    RegRead, CurrentDesktopID, HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SessionInfo\%SessionID%\VirtualDesktops, CurrentVirtualDesktop

変更後:

    RegRead, CurrentDesktopID, HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VirtualDesktops, CurrentVirtualDesktop


### AutoHotkey.ahk ファイルの内容を有効にします

AutoHotkey.ahk ファイルをダブルクリックします。

有効になったら、Windows の通知領域に __緑色の H のアイコン__ が表示されます。

<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/2b14e54e-352b-838c-753e-195ef363d129.jpeg"/>

この状態でマウスの中ボタンを押せば、仮想デスクトップを切り替えることができます。


## 仮想デスクトップをトグルで切り替えるしくみ

上記 AutoHotkey.ahk ファイルの動作は厳密には次のようになっています。

- 2番目の仮想デスクトップが表示されているときは、左側の仮想デスクトップに切り替えます
- それ以外のときは、右側の仮想デスクトップに切り替えます

この動作によって、マウスの中ボタンを押すと、1番目の仮想デスクトップと 2番目の仮想デスクトップを交互に（トグルで）切り替えるという動作になるわけです。

<img width="90%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/9161b3e5-a0f3-a087-baea-d868c0af6442.jpeg"/>

また、ホイールを左または右に傾けることができるマウスを使っているときは、

- ホイールを左に傾けると、左側の仮想デスクトップに切り替えます
- ホイールを右に傾けると、右側の仮想デスクトップに切り替えます

ホイールを傾ける機能を仮想デスクトップの切り替えに割り当てないようにしたい場合は、 AutoHotkey.ahk ファイルを右クリックして Edit Script を選び、最後にある

    WheelLeft::
        SendEvent {LWin down}{LCtrl down}{Left  down}{LWin up}{LCtrl up}{Right up}
        return

    WheelRight::
        SendEvent {LWin down}{LCtrl down}{Right down}{LWin up}{LCtrl up}{Right up}
        return

の部分を削除して「保存」して AutoHotkey.ahk ファイルをダブルクリックして Yes を選びます。


## リモート デスクトップ がある仮想デスクトップから切り替える方法

もし、仮想デスクトップに リモート デスクトップ を表示しているときは、以下のように設定しなければ、マウスの中ボタンを押しても「Windows キーと Ctrl キーと右または左のカーソルキーの3つのキーを同時に」押しても、隣の仮想デスクトップに切り替えることはできません。なぜなら、Windows キーが押された信号がリモート（接続先）に送られてしまうからです。

リモート デスクトップ 接続 >> オプションの表示（左下）>> ローカル リソース（タブ） >> キーボード（中央）>> このコンピューター

<img width="35%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/6183396b-c80f-7788-b64e-a9492b523232.png"/>

ただし、この設定をしている場合、Windows キーを使った ショートカット キー が接続先に対して使えなくなります。

設定を戻すときは、「全画面表示の使用時のみ」に戻します。


## Windows を再起動したときも有効にする設定

Windows を再起動すると AutoHotkey が起動していない状態になり、マウスの中ボタンを押しても仮想デスクトップが切り替わらなくなってしまいます。

Windows を再起動したときに自動的に AutoHotkey が起動してAutoHotkey.ahk ファイルの内容が有効になるように設定するには、スタートアップ フォルダー に AutoHotkey.ahk ファイルへのショートカットを作ります。

- Windows キーを押しながら R キー >> shell:startup（と入力）>> OK
- 開いたフォルダーに AutoHotkey.ahk ファイルを右ドラッグ＆ドロップ >> ショートカットをここに作成

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/7bc460cd-554a-7ec7-353d-b5b4bb98ffaa.png"/>


## 3つ以上の仮想デスクトップがあるとき

AutoHotkey.ahk ファイルの 2行目に書かれている

    SpecialDesktopNum := 2

は、「左側の仮想デスクトップに切り替えるのは 2番目の仮想デスクトップが表示されているとき」という意味です。

もし、3つ目の仮想デスクトップを作った場合、3つ目の仮想デスクトップが表示されているときに左側の仮想デスクトップに切り替えるようにするには、AutoHotkey.ahk ファイルを右クリックして Edit Script を選び、

    SpecialDesktopNum := 3

に変えて「保存」して AutoHotkey.ahk ファイルをダブルクリックして Yes を選びます。


## 押すボタンをカスタマイズするとき

AutoHotkey.ahk ファイルの 1行目に書かれている

    MButton::

は、「マウスの中ボタンが押されたとき」という意味です。

ですので、ここを変えれば、仮想デスクトップを切り替えるときに押すボタンを変えることができます。

たとえば、MButton:: を Tab:: に変えて「保存」して AutoHotkey.ahk ファイルをダブルクリックして Yes を選べば、キーボードの Tab キーを押したときに仮想デスクトップが切り替わるようになります。

    Tab::

キーボードの Insert キーを押したときに仮想デスクトップが切り替わるようにするには、同様に Insert:: に変えます。 

    Insert::

その他のキーについては、AutoHotkey の公式資料を参照してください。 http://ahkwiki.net/KeyList


## 仮想デスクトップを切り替える既定の方法

仮想デスクトップを切り替える既定の方法もおさらいしておきましょう。

Windows 10 では何もインストールせずに仮想デスクトップを使うことができます。 __タスク ビュー__ ボタン（スタート ボタンの2つ右）を押すか、Windows キーと Tab キーを同時に押すと、タスク ビュー が表示されます。その上側に表示されるデスクトップの一覧から表示したいデスクトップをクリックすると、仮想デスクトップを切り替えることができます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/607deae2-b1f9-79b9-63e0-a403f5de5218.jpeg"/>

タッチパッドが付いている PC であれば __指3本をタッチパッドに触れさせて左または右になぞる__ だけでも切り替えることができます。この方法は慣れるとほぼ無意識にできるので、ここで紹介する方法を使うメリットはあまりないかもしれません。ちなみに mac でも同じ操作方法が使えます。しかも、ウィンドウの左上にある緑色のボタンを押して最大化すると自動的に新しい仮想デスクトップに配置されるので、すぐにタッチパッドをなぞるだけで最大化したウィンドウと最大化していないいくつかのウィンドウがあるデスクトップを切り替えることができます。

しかし、タッチパッドがなければ仮想デスクトップをほぼ無意識で切り替えることは難しくなります。先ほど説明したように タスク ビュー を表示して仮想デスクトップを選ぶか、 __Windows キーと Ctrl キーと右または左のカーソルキー__ の3つのキーを同時に押さなければなりません。また、左を押すべきか右を押すべきかを迷うこともよく起きます。それでは顔の向きを変えるだけで隣の画面を見ることができるマルチディスプレイよりも劣ってしまいます。

ちなみに、ウィンドウを別の仮想デスクトップに移動するには、タスク ビュー を表示して、対象のウィンドウを仮想デスクトップにドラッグ＆ドロップします。MoveToDesktop をインストールすれば __Windows キーと Alt キーと右または左のカーソルキー__ の 3つのキーを同時に押すことでも移動できるようになります。 https://github.com/Eun/MoveToDesktop

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427559/9d644699-bc56-f096-5d8f-16a9362dc7e6.jpeg"/>


## 仮想デスクトップのメリット

編集用のウィンドウと参照用のウィンドウの 2枚だけなら Alt + Tab でパタパタ切り替えられますが、編集または参照するウィンドウが増えたときは仮想デスクトップをパタパタ切り替えたほうが便利です。

隣の画面が見たいと思った瞬間にほぼ無意識で切り替えることができるので、マルチディスプレイと同じ感覚で使うことができます。また、切り替えるときの フリック アニメーション がとても気持ちいいのでぜひ体験してみてください。他のキーで切り替えるように設定することもできます。

ちなみに、仮想デスクトップのほうがマルチディスプレイよりも優れている点があります。サンプル コード などをコピー＆ペーストしたいときに隣の画面まで マウス カーソル を移動させる必要はありません。また、2つの内容を見比べたいときに隣の画面まで視線を大きく動かすことを何度も繰り返す必要はありません。もちろん、物理的なディスプレイを追加する必要はありませんしスタバでも使えます。