HDESK CreateDesktop( LPCTSTR DesktopName, LPCTSTR DeviceName, LPDEVMODE DevMode, DWORD ControlFlags, DWORD AccessFlags, LPSECURITY_ATTRIBUTES SecurityAttributes);
この関数はNT3.51以降で使用可能である。
AccessFlagsには、デスクトップのアクセス権を設定する。このアクセス権には、少なくともDESKTOP_CREATEWINDOWが必ず指定されていなければならない。
作成したデスクトップを破棄するには、CloseDesktop関数を実行する。
引数の意味は、以下の通り。
| DesktopName | 作成するデスクトップの名前。\を含んではならない。 |
| DeviceName | NULLでなければならない。 |
| DevMode | NULLでなければならない。 |
| ControlFlags | 後述の表を参照。 |
| AccessFlags | デスクトップに付与するアクセス権を表すビットマスク。後述の表を参照。 |
| SecurityAttributes | デスクトップに付与するセキュリティ属性。 |
ControlFlagsに指定可能なフラグは、以下のフラグの組み合わせである。
| DF_ALLOWOTHERACCOUNTHOOK | デスクトップ上の他のアカウント上で実行されているプロセスが呼び出し元プロセスにフックを設定することを可能とする |
AccessFlagsには、標準アクセス権および以下の固有アクセス権の組み合わせを指定する。
| DESKTOP_READOBJECTS | (説明略) |
| DESKTOP_CREATEWINDOW | (説明略) |
| DESKTOP_CREATEMENU | (説明略) |
| DESKTOP_HOOKCONTROL | (説明略) |
| DESKTOP_JOURNALRECORD | (説明略) |
| DESKTOP_JOURNALPLAYBACK | (説明略) |
| DESKTOP_ENUMERATE | (説明略) |
| DESKTOP_WRITEOBJECTS | (説明略) |
| DESKTOP_SWITCHDESKTOP | (説明略) |
戻り値は、作成したデスクトップのハンドルである。
void DispNewDesktop()
{
HDESK hNewDesk, hOrgDesk, hInputDesk;
DWORD AccessFlag;
/* 新規に作成するデスクトップ用のアクセス権を初期設定 */
AccessFlag =
STANDARD_RIGHTS_ALL
| DESKTOP_CREATEMENU /* これがないとコントロールメニューがなくなる->メッセージボックスの移動不可 */
| DESKTOP_CREATEWINDOW /* 必須 */
| DESKTOP_READOBJECTS
| DESKTOP_SWITCHDESKTOP
| DESKTOP_WRITEOBJECTS
| DESKTOP_ENUMERATE
| DESKTOP_HOOKCONTROL
| DESKTOP_JOURNALPLAYBACK
| DESKTOP_JOURNALRECORD;
/* 元のスレッドのデスクトップを退避 */
hOrgDesk = GetThreadDesktop(GetCurrentThreadId());
/* 元の入力デスクトップを退避 */
hInputDesk = OpenInputDesktop(0, FALSE, AccessFlag);
/* 新規デスクトップを作成 */
hNewDesk = CreateDesktop(
"HogeHoge",
NULL,
NULL,
0,
AccessFlag,
NULL);
if(hNewDesk == NULL) {
MessageBox(NULL, "CreateDesktop() error.", "DiskNewDesktop", MB_OK);
return;
}
/* 作成したデスクトップと現在のスレッドを関連付ける */
SetThreadDesktop(hNewDesk);
/* 作成したデスクトップをアクティブにする */
SwitchDesktop(hNewDesk);
/* メッセージの表示 */
MessageBox(NULL, "Hello", "DispNewDesktop", MB_OK);
/* 元の入力デスクトップをアクティブにする */
SwitchDesktop(hInputDesk);
/* 元のデスクトップと現在のスレッドを関連付ける */
SetThreadDesktop(hOrgDesk);
/* 作成したデスクトップの破棄 */
CloseDesktop(hNewDesk);
/* 入力デスクトップのクローズ */
CloseDesktop(hInputDesk);
}