[PR]

タスクバーに表示されないウィンドウを作る

戻る

 生成されたウィンドウが以下の3つの条件を満たす場合、ウィンドウはタスクバーへ登録されます。

  • 可視である
  • 拡張スタイルにスタイル WS_EX_TOOLWINDOW が指定されていない
  • 他のウィンドウに所有されていないか、拡張スタイルにスタイル WS_EX_APPWINDOW が指定されている

 タスクバーに表示されないウィンドウを作る方法には少なくとも以下の3つがあると言えます。

  • 不可視なウィンドウを作成する
  • 拡張スタイルにスタイル WS_EX_TOOLWINDOW を指定する
  • 他のウィンドウに所有させる

不可視なウィンドウを作成する

 不可視なウィンドウはタスクバーに登録されません。
 これはウィンドウメッセージを受け取る必要はあるがウィンドウをユーザーに表示する必要がないような常駐型アプリケーションなどで有効な方法です。
 ウィンドウをユーザーに表示する必要がある場合、もう一工夫が必要になります。

スタイル WS_EX_TOOLWINDOW を指定する

 ウィンドウの拡張スタイルにスタイル WS_EX_TOOLWINDOW を指定してウィンドウを生成することで、タスクバーに登録されない可視ウィンドウを作成することが出来ます。
 これはタスクバーに表示されない可視ウィンドウを作る方法としては比較的簡単な方法です。
 この方法で作成されるウィンドウには以下のような制限があります。

  • タイトルバーのサイズが通常のウィンドウと異なる。
  • タイトルバーにウィンドウアイコンが描画されない。
  • タイトルバーにボタン [最大化], [最小化], [元のサイズに戻す] が無い。
  • システムメニューに項目 [最大化], [最小化], [元のサイズに戻す] が無い。
  • [Alt] + [tab] で表示されるタスクリストに登録されない。

他のウィンドウに所有させる

 まず初めに可視ウィンドウのオーナーとなる不可視ウィンドウを作成します。
 このウィンドウは不可視ウィンドウですからタスクバーには登録されません。
 次に、先に作成した不可視ウィンドウをオーナーとして可視ウィンドウを作成します。
 この可視ウィンドウは他のウィンドウに所有されているためタスクバーには登録されません。
 このようにしてタスクバーに登録されない可視ウィンドウを得ることが出来ます。
 これはタスクバーに表示されない可視ウィンドウを作る方法としては自由度の高い方法です。
 この方法であればタスクバーに表示されない可視ウィンドウを最小化できるようにすることが出来ます。
 タスクバーに表示されない可視ウィンドウにウィンドウの最小化を許可する場合、ウィンドウが最小化される時にウィンドウを不可視状態にしてタスクトレイの通知領域にアイコンを登録する等の代替手段が必要になることに注意してください。
 タスクバーに登録されたウィンドウが最小化される場合、タスクバーに登録されたボタンを残して最小化されたウィンドウが表示されなくなるのですが、タスクバーに登録されていないウィンドウでは、この「タスクバーに登録されたボタンを残して」という仕組みが成り立たないためです。
 以下にタスクバーに登録されない可視ウィンドウを作成するまでのコードの一部を示します。

	// 不可視ウィンドウのウィンドウクラスを登録する
	WNDCLASSEX wcHide; // 不可視ウィンドウのウィンドウクラス
	memset( &wcHide, 0, sizeof( wcHide ) ); 
	wcHide.cbSize = sizeof( wcHide );
	…… 省略 ……

	// 可視ウィンドウのオーナーになる不可視ウィンドウを作成する
	HWND hwndHide = CreateWindow
		(
			wcHide.lpszClassName, // クラス名
			"",                   // ウィンドウ名
			style & ~WS_VISIBLE,  // [!! 重要 !!] スタイルには WS_VISIBLE を指定しないこと
			CW_USEDEFAULT,        // x 座標
			CW_USEDEFAULT,        // y 座標
			CW_USEDEFAULT,        // 幅
			CW_USEDEFAULT,        // 高さ
			HWND_DESKTOP,         // オーナーウィンドウ
			NULL,                 // メニューハンドル
			wcHide.hInstance,     // ウィンドウに関連付けられたモジュールのインスタンス
			0                     // ウィンドウ作成データ
		);

	// 可視ウィンドウのウィンドウクラスを登録する
	WNDCLASSEX wc; // 可視ウィンドウのウィンドウクラス
	memset( &wc, 0, sizeof( wc ) ); 
	wc.cbSize = sizeof( wc );
	…… 省略 ……

	// タスクバーに登録されない可視ウィンドウを作成する
	HWND hwnd = CreateWindow
		(
			wc.lpszClassName, // クラス名
			"",               // ウィンドウ名
			WS_VISIBLE,       // [!! 重要 !!] こちらはスタイルに WS_VISIBLE を指定してもよい
			CW_USEDEFAULT,    // x 座標
			CW_USEDEFAULT,    // y 座標
			CW_USEDEFAULT,    // 幅
			CW_USEDEFAULT,    // 高さ
			hwndHide,         // [!! 重要 !!] 不可視ウィンドウをオーナーに指定する
			NULL,             // メニューハンドル
			wc.hInstance,     // ウィンドウに関連付けられたモジュールのインスタンス
			0                 // ウィンドウ作成データ
		);

関連

タスクバーの起動を検出する
タスクトレイの通知領域にアイコンを登録する
通知領域のアイコンを再登録する



Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp