OpenInputDesktop アクティブなデスクトップのオープン

Cの宣言:

HDESK OpenInputDesktop(
	DWORD ControlFlags,
	BOOL Inheritance,
	DWORD AccessFlags);

説明:

現在ユーザ入力を受け付けているデスクトップをオープンし、ハンドルを取得する。

この関数はNT3.51以降で使用可能である。

オープンしたハンドルをクローズするには、CloseDesktop関数を実行する。

引数の意味は以下の通り。
ControlFlags CreateDesktopを参照。
Interitance 選られたハンドルが継承可能かどうかを表すハンドル。
AccessFlags CreateDesktopを参照。

戻り値は、オープンしたアクティブなデスクトップのハンドルである。

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 更新)

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