Windows7 でタスクバーを隠す

 フルスクリーン描画したいのに、タスクバーが前面に出ちゃってどうしようもないときにした対応の覚書。

概要

 タスクバーウィンドウを獲得して、表示を隠す指示を出す。
 そのままにすると、アプリを終了しても隠れたままになってしまうので、終了時に元に戻すようにする。

問題点

 この方法では、フルスクリーン状態で別のウィンドウをアクティブにしても、タスクバーは戻らない。
 対応するとしたらイベントハンドラとかか。

サンプル

 以下はダイアログアプリのサンプル。

/*
 * タスクバー獲得と非表示処理
 */
HWND taskbar = ::FindWindow("Shell_TrayWnd" , NULL);
// タスクバースタートボタン
HWND taskbar_button = NULL;
if (taskbar != NULL) {
	// タスクバースタートボタン獲得 from タスクバー
	taskbar_button = ::FindWindowEx(taskbar, NULL, "Button", NULL);
	if (taskbar_button == NULL) {
		// タスクバーからスタートボタンを獲得できない場合
		// 全体から獲得
		taskbar_button = ::FindWindow("Button" , NULL);
	}
	// タスクバーを隠す
	::ShowWindow(taskbar, SW_HIDE);
	if (taskbar_button != NULL) {
		// タスクバーボタンを隠す
		::ShowWindow(taskbar_button, SW_HIDE);
	}
}
/* // タスクバー獲得と非表示処理 */

try {
	MyAppDlg dlg;
	m_pMainWnd = &dlg;
	INT_PTR nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		// TODO: ダイアログが <OK> で消された時のコードを
		//  記述してください。
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: ダイアログが <キャンセル> で消された時のコードを
		//  記述してください。
	}
} catch (char *e) {
	AfxMessageBox(e, MB_ICONWARNING);
} catch (CException *e) {
	e->ReportError();
	e->Delete();
}

/*
 * タスクバー復帰
 */
if (taskbar != 0) {
	// タスクバーを隠す
	::ShowWindow(taskbar, SW_SHOWDEFAULT);
	if (taskbar_button != NULL) {
		// タスクバーボタンを隠す
		::ShowWindow(taskbar_button, SW_SHOWDEFAULT);
		::DestroyWindow(taskbar_button); // 解放
	}
	::DestroyWindow(taskbar); // 解放
}
/* // タスクバー復帰 */