kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

CreateDesktopによる仮想デスクトップ

Windows 10になって仮想(マルチ)デスクトップが入るみたいですが、しばらく現行Windowsにて仮想デスクトップが出来ないかいじっていました。

CreateDesktopに関しては、前々から気にしつつも見ていなかったのですが、調べてみると結構簡単でした。

/*
  1. 新しいデスクトップを作成して
  2. 切り替えて、
  3. 3秒間まって
  4. 元に戻す。
*/
#include <Windows.h>
#include <tchar.h>

int main() {
  HDESK current = OpenInputDesktop(0, FALSE, GENERIC_ALL);

  HDESK desk = CreateDesktop(_T("NewDesktop"), NULL, NULL, 0, GENERIC_ALL, NULL); // 1.

  SwitchDesktop(desk); // 2.

  Sleep(3 * 1000); // 3.

  SwitchDesktop(current); // 4.

  CloseDesktop(desk);
  CloseDesktop(current);
}

不用意に動かすと元のデスクトップに戻ってこれないので注意です。Explorerが無いので詰みます。...まあ、何度もやりました。

MSDNにまとまったドキュメントがあります。分量もそれほど多くありません。調べてみるまで全然知らなかったんですが、面白い構造になっています。

Logonとかスクリーンセーバーとか別のデスクトップだったんすねぇ~と。

ただ、まあ、コレで出来る仮想デスクトップはあまりうまくない(万人向けではない)です。一通りくみ上げて、しばらく使っていたのですが、

  1. アプリがすでに動いている場合、別のデスクトップで新しく起動しないものがある(Chrome等)
  2. デフォルトのデスクトップ以外だとNAS上のOfficeファイルが開けない場合がある

1.はアプリのつくりに依存します。UIスレッドは所属するデスクトップを切り替えられないといった制限もあるので(つまり、ウィンドウはデスクトップ間を移動できない)、使い方に制限が出来ます。

2.に関して、通常設定のOfficeはNAS上のファイルを開く際、警告が出て編集できない状態で開きます。この状態のファイルは、デフォルト以外のデスクトップではうまく開けません。一旦警告を確認して、編集可能状態にすれば問題なく開けるようになります。

こんな感じで、分かって使う分には問題ないんですが、広く一般に使ってもらうのは厳しい感じになります。ただ、分かって使う分には作業コンテキストをズバッと切り替えられるので、便利なんですけどね。

CreateDesktopを使わずに、仮想デスクトップを実現するアプリもあって、Windowsではそっちのが主流っぽいです。実装のアイデアが浮かんだので、そちらも軽く実装してみましたが、確かに筋はよさそうに感じました。まあ、個人的にはCreateDesktopを用いたほうが好みですね。

Windows 10はまだ見ていませんが、どんな感じに実装されてるのかなーと見てみるのも面白そうです。