CreateDesktop デスクトップの新規作成

Cの宣言:

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 (説明略)

戻り値は、作成したデスクトップのハンドルである。

Cのサンプル:

新規のデスクトップを作成して可視化し、そのデスクトップ上にメッセージボックスを表示する。メッセージボックスのOKボタンが押下されたら、元のデスクトップを再び入力デスクトップとした上で、作成したデスクトップを破棄し、終了する。
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);
}


(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。