HDESK OpenInputDesktop( DWORD ControlFlags, BOOL Inheritance, DWORD AccessFlags);
この関数はNT3.51以降で使用可能である。
オープンしたハンドルをクローズするには、CloseDesktop関数を実行する。
引数の意味は以下の通り。
| ControlFlags | CreateDesktopを参照。 |
| Interitance | 選られたハンドルが継承可能かどうかを表すハンドル。 |
| AccessFlags | CreateDesktopを参照。 |
戻り値は、オープンしたアクティブなデスクトップのハンドルである。
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);
}