ITaskbarList3
COM公式ドキュメント
ITaskbarList2 を拡張し、Windows 7 で追加された、統合された起動とタスクバーボタンの切り替え機能をサポートするメソッドを公開します。
解説(Remarks)
このインターフェイスは、継承元である ITaskbarList および ITaskbarList2 インターフェイスのメソッドも提供します。
実装するタイミング
このインターフェイスの実装は、CLSID_TaskbarList として Windows に用意されています。このインターフェイスがサードパーティによって実装されることはありません。使用するタイミング
このインターフェイスのメソッドは、次の目的で使用します。- タスクバー上でウィンドウをグループとして表示している TDI アプリケーション (Windows Internet Explorer など) や MDI アプリケーション (Microsoft Excel など) を扱う場合:
<ul> - 個々のタブやドキュメントの表示を表すサムネイルをタスクバーに提供する。
- 個々のタブやドキュメントのサムネイルをグループから削除する。
- グループ内のサムネイルの順序を変更する。
- サムネイルの表示時に、あるタブのサムネイルを選択項目として設定する。
メソッド 12
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
タスクバーボタンにホストされる進行状況バーを表示または更新し、操作全体のうち完了した具体的な割合を示します。
| hwnd | HWND | in | 進行状況インジケーターとして使用される、関連付けられたタスクバーボタンを持つウィンドウのハンドル。 |
| ullCompleted | ULONGLONG | in | メソッドが呼び出された時点で操作のうち完了した割合を示す、アプリケーション定義の値。 |
| ullTotal | ULONGLONG | in | 操作が完了したときに ullCompleted が取る値を指定する、アプリケーション定義の値。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
確定的進行状況バーのライフサイクル
アプリケーションはまず SetProgressValue を呼び出して確定的進行状況バーの表示を開始し、その後、進行状況の変化に応じて必要なだけ再度呼び出してバーを更新します。進行が完了したら、アプリケーションは SetProgressState を TBPF_NOPROGRESS フラグ付きで呼び出して進行状況バーを消去する必要があります。タスクバーボタンがグループの進行状況インジケーターを選択する方法
タスクバーボタンが進行状況インジケーターを表示できるのは、一度に 1 つのウィンドウについてのみです。タスクバーボタンがグループを表しており、そのグループ内の複数のウィンドウが進行状況情報をブロードキャストしている場合、タスクバーボタンは次の状態の優先順位に基づいて表示する進行状況を選択します。| 優先順位 | 状態 |
|---|---|
| 1 | TBPF_ERROR |
| 2 | TBPF_PAUSED |
| 3 | TBPF_NORMAL |
| 4 | TBPF_INDETERMINATE |
SetProgressState がそのウィンドウにブロック状態 (TBPF_ERROR または TBPF_PAUSED) を設定していない限り、SetProgressValue の呼び出しは、明示的に設定されていなくても TBPF_NORMAL 状態を想定します。SetProgressValue の呼び出しは TBPF_INDETERMINATE 状態を上書きしてクリアします。
2 つのウィンドウが確定的な進行状況をブロードキャストしていて優先順位が衝突する場合は、進行が最も少ないウィンドウが使用されます。
この優先順位に基づき、この確定的 (具体的な割合を示す) 進行状況インジケーターは次の場合に表示されます。
- タスクバーボタンがグループを表しておらず、それが表す唯一のウィンドウがこのメソッドを通じて確定的な進行状況情報をブロードキャストしている場合。
- タスクバーボタンがグループを表しており、そのグループ内で進行状況情報をブロードキャストしているウィンドウが 1 つだけで、そのウィンドウがこのメソッドを通じて確定的な進行状況情報をブロードキャストしている場合。
- タスクバーボタンがグループを表しており、そのグループ内の複数のウィンドウが進行状況情報をブロードキャストしていて、そのうち少なくとも 1 つがこのメソッドを通じて進行状況情報をブロードキャストしており、いずれのウィンドウも TBPF_ERROR または TBPF_PAUSED 状態を設定していない場合。
グループ内のいずれかのウィンドウが TBPF_ERROR または TBPF_PAUSED を設定している場合は、その状態がボタン表示に使用されます。ただし、グループ内の他のブロックされていないウィンドウに対して SetProgressValue を呼び出し、それらの進行状況をバックグラウンドで更新することは引き続き可能です。
例
次の例は、操作の実行中に ITaskbarList3 を使用して進行状況を表示する方法を示しています。
HRESULT CMyApp::ShowProgressInTaskbar(HWND hwnd, __in ITaskbarList3 *pTL)
{
// Set the progress state of the button to indeterminate while you calculate
// the number of operations to be performed.
HRESULT hr = pTL->SetProgressState(hwnd, TBPF_INDETERMINATE);
// Calculate the number of operations to perform.
int cTotalOperations = _CalculateNumberOfOperationsToPerform();
for (int i=0; i < cTotalOperations && SUCCEEDED(hr); i++)
{
// Update the progress. This call to SetProgressValue cancels the
// indeterminate state and puts the button into normal progress mode.
pTL->SetProgressValue(hwnd, i, cTotalOperations);
// Do whatever operation your application needs to perform.
hr = _PerformOperation(i);
}
// Tell the button that progress no longer needs to be displayed.
pTL->SetProgressState(hwnd, TBPF_NOPROGRESS);
return hr;
}
タスクバーボタンに表示される進行状況インジケーターの種類と状態を設定します。
| hwnd | HWND | in | 操作の進行状況を表示するウィンドウのハンドル。このウィンドウに関連付けられたタスクバーボタンに進行状況バーが表示されます。 |
| tbpFlags | TBPFLAG | in | 進行状況ボタンの現在の状態を制御するフラグ。次のフラグのうち 1 つだけを指定します。すべての状態は互いに排他的です。 TBPF_NOPROGRESS (0x00000000)進行状況の表示を停止し、ボタンを通常の状態に戻します。操作が完了またはキャンセルされたときに、このフラグを指定してこのメソッドを呼び出し、進行状況バーを消去します。 TBPF_INDETERMINATE (0x00000001)進行状況インジケーターはサイズが大きくなるのではなく、タスクバーボタンの長さに沿って繰り返し循環します。これは、進行のうちどの程度が完了したかを指定せずに、活動が行われていることを示します。進行は行われていますが、操作にどれだけの時間がかかるかの予測はありません。 TBPF_NORMAL (0x00000002)進行状況インジケーターは、操作の推定完了量に比例して、左から右へサイズが大きくなります。これは確定的な進行状況インジケーターであり、操作の所要時間について予測が行われています。 TBPF_ERROR (0x00000004)進行状況をブロードキャストしているいずれかのウィンドウでエラーが発生したことを示すため、進行状況インジケーターが赤くなります。これは確定的な状態です。進行状況インジケーターが不確定状態の場合は、実際の進行を示さない一般的な割合を赤の確定的表示に切り替えます。 TBPF_PAUSED (0x00000008)いずれかのウィンドウで現在進行が停止しているが、ユーザーが再開できることを示すため、進行状況インジケーターが黄色くなります。エラー状態は存在せず、進行の継続を妨げるものは何もありません。これは確定的な状態です。進行状況インジケーターが不確定状態の場合は、実際の進行を示さない一般的な割合を黄色の確定的表示に切り替えます。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
アクセシビリティの必要性が損なわれないことを保証するため、進行状況バーの情報はハイコントラストの配色では表示されません。
既存の プログレスバー コントロールに慣れた開発者にとって、タスクバーボタンの進行状況インジケーターは、概念的にも視覚的にも同様の体験に感じられるはずです。ここでは、タスクバーボタン自体が進行状況バーになります。タスクバーボタンの進行状況インジケーターは、関連付けられたウィンドウ内のより詳細な進行状況バーを反映したものであるべきです。これにより、ユーザーは、割合の数値や残り時間など、タスクバーボタンには表示できない詳細を確認できます。また、タスクバーボタンはグループ内の 1 つのウィンドウの進行状況しか表示できないため、ユーザーは個々のウィンドウの進行状況を確認できます。さらに、ハイコントラストの配色などタスクバーボタンでは表示できない場合にも、ユーザーに進行状況情報を提供します。
タスクバーボタンの進行状況バーは、Web ページの読み込みやドキュメントの印刷といった通常は周辺的な操作での使用を意図したものではないことに注意してください。その種の進行状況は、引き続きウィンドウの ステータスバー に表示すべきです。
進行状況インジケーターは、タスクバーボタンのアイコンまたはテキストと背景の間に表示されます。アクティブなタスクバーボタンと非アクティブなボタンの両方で進行状況が表示される場合、それぞれの進行状況バーの陰影付けは、アクティブなボタンがユーザーに明確に分かるように調整されます。また、進行状況の表示にボタンが使用されている場合でも、サムネイルの表示などのボタン機能は通常どおり動作し続けます。
エラーまたは一時停止状態を終了するときは、元の状態を続行する場合は TBPF_NORMAL または TBPF_INDETERMINATE フラグを、操作がキャンセルされた場合は TBPF_NOPROGRESS フラグを指定して、このメソッドを再度呼び出します。
タスクバーボタンがグループの進行状況インジケーターを選択する方法
タスクバーボタンが進行状況インジケーターを表示できるのは、一度に 1 つのウィンドウについてのみです。これには、タスクバーボタンがグループを表しており、そのグループ内の複数のウィンドウが進行状況情報をブロードキャストしている状況も含まれます。その場合、タスクバーボタンは状態の優先順位に基づいて表示する進行状況を選択します。状態の優先順位は次の表のとおりで、優先順位 1 が最も高くなります。| 優先順位 | 状態 |
|---|---|
| 1 | TBPF_ERROR |
| 2 | TBPF_PAUSED |
| 3 | TBPF_NORMAL |
| 4 | TBPF_INDETERMINATE |
ウィンドウの状態を変更すると、グループ内の他のウィンドウとの相対的な優先順位が変わり、その結果、タスクバーボタンの進行状況インジケーターにどのウィンドウが使用されるかが変わる場合があります。
確定的な進行状況をブロードキャストしている 2 つのウィンドウ間で優先順位が衝突する場合は、進行が最も少ないウィンドウが使用されます。
この優先順位に基づき、不確定な進行状況インジケーターは次の場合にのみタスクバーボタンに表示できます。
- タスクバーボタンがグループを表しておらず、それが表す唯一のウィンドウが TBPF_INDETERMINATE を設定している場合。
- タスクバーボタンがグループを表しており、そのグループ内で進行状況情報をブロードキャストしているウィンドウが 1 つだけで、そのウィンドウが TBPF_INDETERMINATE を設定している場合。
- タスクバーボタンがグループを表しており、そのグループ内の複数のウィンドウが進行状況情報をブロードキャストしていて、それらすべてのウィンドウが TBPF_INDETERMINATE を設定している場合。
確定的な進行状況インジケーターは次の場合に表示できます。
- タスクバーボタンがグループを表しておらず、それが表す唯一のウィンドウが確定的な進行状況情報をブロードキャストしている場合。
- タスクバーボタンがグループを表しており、そのグループ内で進行状況情報をブロードキャストしているウィンドウが 1 つだけで、そのウィンドウが確定的な進行状況情報をブロードキャストしている場合。
- タスクバーボタンがグループを表しており、そのグループ内の複数のウィンドウが進行状況情報をブロードキャストしていて、そのうち少なくとも 1 つが確定的な進行状況情報をブロードキャストしており、いずれのウィンドウも TBPF_ERROR または TBPF_PAUSED を設定していない場合。
SetProgressValue の呼び出しは、現在不確定モード (TBPF_INDETERMINATE) にある進行状況インジケーターを通常 (確定的) 表示に切り替え、TBPF_INDETERMINATE フラグをクリアすることに注意してください。
アプリケーションのタスクバーグループのフライアウトに表示するための新しいタブまたはドキュメントのサムネイルが提供されたことをタスクバーに通知します。
| hwndTab | HWND | in | タブまたはドキュメントのウィンドウのハンドル。この値は必須であり、NULL にすることはできません。 |
| hwndMDI | HWND | in | アプリケーションのメインウィンドウのハンドル。この値は、新しいサムネイルをどのアプリケーションのプレビューグループにアタッチするかをタスクバーに伝えます。この値は必須であり、NULL にすることはできません。 |
戻り値
Type: HRESULT
成功した場合は S_OK を、それ以外の場合はエラー値を返します。いずれかのパラメーターが NULL の場合、このメソッドはエラーを返します。
解説(Remarks)
タブのサムネイルを登録するだけでは、それが表示されることはありません。グループにどこへ表示するかを指示するために、ITaskbarList3::SetTabOrder も呼び出す必要があります。
アプリケーションでタブまたはドキュメントが閉じられたときに、そのサムネイルをアプリケーションのプレビューグループから削除します。
| hwndTab | HWND | in | サムネイルを削除するタブウィンドウのハンドル。これは、ITaskbarList3::RegisterTab を通じてサムネイルをグループの一部として登録したときと同じ値です。この値は必須であり、NULL にすることはできません。 |
戻り値
Type: HRESULT
成功した場合は S_OK を、それ以外の場合はエラー値を返します。hwndTab が NULL の場合、このメソッドはエラーを返します。
解説(Remarks)
hwndTab を DestroyWindow を通じて解放するのは、呼び出し側アプリケーションの責任です。UnregisterTab はハンドルが解放される前に呼び出す必要があります。
タブ付きドキュメントインターフェイス (TDI) またはマルチドキュメントインターフェイス (MDI) アプリケーションのグループフライアウトに新しいサムネイルを挿入するか、既存のサムネイルをアプリケーションのグループ内の新しい位置に移動します。
| hwndTab | HWND | in | 配置するサムネイルを持つタブウィンドウのハンドル。この値は必須で、ITaskbarList3::RegisterTab を通じてあらかじめ登録されている必要があり、NULL にすることはできません。 |
| hwndInsertBefore | HWND | in | hwndTab をその左側に挿入する対象となるタブウィンドウのハンドル。このハンドルは ITaskbarList3::RegisterTab を通じてあらかじめ登録されている必要があります。この値が NULL の場合、新しいサムネイルはリストの末尾に追加されます。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
サムネイルをグループに表示するには、このメソッドを呼び出す必要があります。ITaskbarList3::RegisterTab を呼び出した後に呼び出してください。
タブまたはドキュメントのウィンドウがアクティブウィンドウになったことをタスクバーに通知します。
| hwndTab | HWND | in | アクティブなタブウィンドウのハンドル。このハンドルは ITaskbarList3::RegisterTab を通じてあらかじめ登録されている必要があります。アクティブなタブがない場合、この値は NULL にできます。 |
| hwndMDI | HWND | in | アプリケーションのメインウィンドウのハンドル。この値は、そのサムネイルがどのグループのメンバーであるかをタスクバーに伝えます。この値は必須であり、NULL にすることはできません。 |
| dwReserved | DWORD | in | 予約済み。0 を設定します。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
指定された一連のボタンを含むサムネイルツールバーを、タスクバーボタンのフライアウト内にあるウィンドウのサムネイル画像に追加します。
| hwnd | HWND | in | ツールバーを受け取るサムネイル表示を持つウィンドウのハンドル。このハンドルは呼び出し側プロセスに属している必要があります。 |
| cButtons | DWORD | in | pButton が指す配列で定義されているボタンの数。許可されるボタンの最大数は 7 です。 |
| pButton | THUMBBUTTON* | in | THUMBBUTTON 構造体の配列へのポインター。各 THUMBBUTTON は、ツールバーに追加する個々のボタンを定義します。ボタンは後から追加や削除ができないため、これが定義される全セットである必要があります。また、ボタンは並べ替えることもできないため、配列内での順序 (左から右へ表示される順序) がそのまま恒久的な順序になります。 |
戻り値
Type: HRESULT
成功した場合は S_OK を、それ以外の場合は次を含むエラー値を返します。
| 戻りコード | 説明 |
|---|---|
| E_INVALIDARG | hwnd パラメーターが、プロセスに属するハンドルを指定していないか、タスクバーボタンに関連付けられたウィンドウを指定していません。この値は、pButton が 1 未満または 7 を超える場合にも返されます。 |
解説(Remarks)
このメソッドを使用すると、アプリケーションは、ウィンドウのタスクバーサムネイルプレビューに埋め込まれたアクティブなツールバーコントロール用のボタンを定義できます。これにより、ユーザーがウィンドウを復元またはアクティブ化することなく、ウィンドウの主要なコマンドにアクセスできます。たとえば、Windows Media Player は、再生、一時停止、ミュート、停止といった標準的なメディア操作コントロールを提供する場合があります。
サムネイルで使用されるツールバーは、本質的には標準の ツールバー コントロールです。ボタンは最大 7 個で、中央揃え、透明で、サムネイルの一部を覆うのではなくその下の領域に表示されます。各ボタンの ID、画像、ツールチップ、状態は THUMBBUTTON 構造体で定義され、その後タスクバーに渡されます。その後、アプリケーションは現在の状態に応じて必要に応じて、ITaskbarList3::ThumbBarUpdateButtons を呼び出すことで、サムネイルツールバーのボタンを表示、変更、または非表示にできます。
サムネイルツールバー内のボタンがクリックされると、そのサムネイルに関連付けられたウィンドウに WM_COMMAND メッセージが送信され、その wParam パラメーターの HIWORD が THBN_CLICKED に、LOWORD がボタン ID に設定されます。
ツールバーがサムネイルに追加された後は、ボタンは ITaskbarList3::ThumbBarUpdateButtons を通じてのみ変更できます。個々のボタンを追加または削除することはできませんが、必要に応じて ThumbBarUpdateButtons を通じて表示および非表示にできます。ツールバー自体は、ウィンドウ自体を再作成しない限り削除できません。
サムネイルを表示する領域は限られており、さらに表示するサムネイルの数も絶えず変化するため、アプリケーションに特定のツールバーサイズが保証されるわけではありません。表示領域が不足している場合、ツールバーのボタンは必要に応じて右から左へ切り詰められます。したがって、アプリケーションはボタンに関連付けられたコマンドに優先順位を付け、最も優先度の高いものが左側になり、切り詰められる可能性が最も低くなるようにする必要があります。
サムネイルツールバーは、サムネイルが表示されているときにのみ表示されます。たとえば、タスクバーボタンが、サムネイルを表示する余地よりも多くの開いているウィンドウを含むグループを表している場合、UI はサムネイルではなくレガシーメニューに切り替わります。
アクセシビリティ
サムバーのボタン画像におけるアクセシビリティについては、ThumbBarSetImageList の「解説」セクションを参照してください。
例
次の例は、ThumbBarAddButtons を使用して、拡張タスクバー上のサムネイルに 2 つのボタンを含むツールバーを追加する方法を示しています。
HRESULT AddThumbBarButtons(HWND hwnd, HIMAGELIST himl, HIMAGELIST himlHot)
{
// Define an array of two buttons. These buttons provide images through an
// image list and also provide tooltips.
DWORD dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
THUMBBUTTON thbButtons[2];
thbButtons[0].dwMask = dwMask;
thbButtons[0].iId = 0;
thbButtons[0].iBitmap = 0;
thbButtons[0].pszTip = TEXT("Button 1");
thbButtons[0].dwFlags = THBF_DISMISSONCLICK;
dwMask = THB_BITMAP | THB_TOOLTIP;
thbButtons[1].dwMask = dwMask;
thbButtons[1].iId = 1;
thbButtons[1].iBitmap = 1;
thbButtons[1].pszTip = TEXT("Button 2");
// Create an instance of ITaskbarList3
ITaskBarList3 *ptbl;
HRESULT hr = CoCreateInstance(CLSID_TaskbarList,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&ptbl);
if (SUCCEEDED(hr))
{
// Declare the image list that contains the button images.
hr = ptbl->ThumbBarSetImageList(hwnd, himl);
if (SUCCEEDED(hr))
{
// Attach the toolbar to the thumbnail.
hr = ptbl->ThumbBarAddButtons(hwnd, ARRAYSIZE(thbButtons), &thbButtons);
}
ptbl->Release();
}
return hr;
}
ウィンドウの現在の状態に応じて、サムネイルツールバーのボタンを表示、有効化、無効化、または非表示にします。サムネイルツールバーとは、タスクバーボタンのフライアウト内にあるウィンドウのサムネイル画像に埋め込まれたツールバーです。
| hwnd | HWND | in | ツールバーを含むサムネイル表示を持つウィンドウのハンドル。 |
| cButtons | DWORD | in | pButton が指す配列で定義されているボタンの数。許可されるボタンの最大数は 7 です。この配列には、更新対象となる既存のボタンを表す構造体のみが含まれます。 |
| pButton | THUMBBUTTON* | in | THUMBBUTTON 構造体の配列へのポインター。各 THUMBBUTTON は個々のボタンを定義します。ボタンがすでに存在する場合 (iId 値がすでに定義されている場合)、その既存のボタンは構造体で提供された情報で更新されます。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
サムネイルを表示する領域は限られており、さらに表示するサムネイルの数も絶えず変化するため、アプリケーションに特定のツールバーサイズが保証されるわけではありません。表示領域が不足している場合、ツールバーのボタンは必要に応じて右から左へ切り詰められます。したがって、アプリケーションはボタンに関連付けられたコマンドに優先順位を付け、最も優先度の高いものが左側になり、切り詰められる可能性が最も低くなるようにする必要があります。
サムネイルツールバーは、タスクバーにサムネイルが表示されているときにのみ表示されます。たとえば、タスクバーボタンが、サムネイルを表示する余地よりも多くの開いているウィンドウを含むグループを表している場合、UI はサムネイルではなくレガシーメニューに切り替わります。
アクセシビリティ
サムバーのボタン画像におけるアクセシビリティについては、ThumbBarSetImageList の「解説」セクションを参照してください。
例
次の例は、ThumbBarUpdateButtons を使用して、拡張タスクバー上のサムネイルツールバー内の既存ボタンのテキストと画像を変更する方法を示しています。
HRESULT UpdateThumbBarButton(HWND hwnd)
{
// Define a single structure for the button to update. The ID is that
// of an existing button, so the other information (bitmap index and
// tooltip) overwrites the existing values, updating the button.
THUMBBUTTON thbButton;
thbButton.dwMask = THB_BITMAP | THB_TOOLTIP;
thbButtons[0].iId = 1;
thbButton.iBitmap = 3;
thbButton.pszTip = TEXT("Different Text");
// Create an instance of ITaskbarList3
ITaskBarList3 *ptbl;
HRESULT hr = CoCreateInstance(CLSID_TaskbarList,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&ptbl);
if (SUCCEEDED(hr))
{
// Update the toolbar. In this case, only the single button is updated.
hr = ptbl->ThumbBarUpdateButtons(hwnd, 1, &thbButton);
ptbl->Release();
}
return hr;
}
タスクバーボタンのフライアウト内にあるウィンドウのサムネイル画像に埋め込まれたツールバー用の、ボタン画像を含むイメージリストを指定します。
| hwnd | HWND | in | 更新対象のツールバーを含むサムネイル表示を持つウィンドウのハンドル。このハンドルは呼び出し側プロセスに属している必要があります。 |
| himl | HIMAGELIST | in | ツールバーで使用するすべてのボタン画像を含むイメージリストのハンドル。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
アプリケーションは、次のボタン画像を提供する必要があります。
- 既定のアクティブ状態のボタン。
- 高 DPI (ドット/インチ) ディスプレイでの使用に適した画像。
画像は 32 ビットで、寸法は GetSystemMetrics(SM_CXICON) x GetSystemMetrics(SM_CYICON) である必要があります。ボタンのクリック時、無効時、ホバー時の状態のビジュアルは、ツールバー自体が提供します。
アクセシビリティ
イメージリストからインデックス付けされ、THUMBBUTTON 構造体で指定されるボタン画像は、さまざまなユーザー個人設定のシナリオで使用できます。一般的な例としては、ライト/ダークのカラーモードや、アクセシビリティのためのコントラストテーマがあります。これらすべてのコンテキストで視覚的に明確なままとなるアセットを選択してください。
これには次の 2 つの方法で対応できます。
- テーマ変更イベントを登録し (Win32 アプリでダーク テーマとライト テーマをサポートする を参照)、テーマ変更時にボタンを更新する。
- ソリッドな白い塗りとソリッドな黒い輪郭を持つグリフのような、コントラストが組み込まれたアセットを使用する。
例
次の例は、画像がイメージリストから提供される 2 つのボタンを持つサムネイルツールバーを作成する方法を示しています。
HRESULT AddThumbBarButtons(HWND hwnd, HIMAGELIST himl, HIMAGELIST himlHot)
{
// Define an array of two buttons. These buttons provide images through an
// image list and also provide tooltips.
DWORD dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
THUMBBUTTON thbButtons[2];
thbButtons[0].dwMask = dwMask;
thbButtons[0].iId = 0;
thbButtons[0].iBitmap = 0;
thbButtons[0].pszTip = TEXT("Button 1");
thbButtons[0].dwFlags = THBF_DISMISSONCLICK;
dwMask = THB_BITMAP | THB_TOOLTIP;
thbButtons[1].dwMask = dwMask;
thbButtons[1].iId = 1;
thbButtons[1].iBitmap = 1;
thbButtons[1].pszTip = TEXT("Button 2");
// Create an instance of ITaskbarList3
ITaskBarList3 *ptbl;
HRESULT hr = CoCreateInstance(CLSID_TaskbarList,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&ptbl);
if (SUCCEEDED(hr))
{
// Declare the image list that contains the button images.
hr = ptbl->ThumbBarSetImageList(hwnd, himl);
if (SUCCEEDED(hr))
{
// Attach the toolbar to the thumbnail.
hr = ptbl->ThumbBarAddButtons(hwnd, ARRAYSIZE(thbButtons), &thbButtons);
}
ptbl->Release();
}
return hr;
}
タスクバーボタンにオーバーレイを適用して、アプリケーションの状態やユーザーへの通知を示します。
| hwnd | HWND | in | オーバーレイを受け取る、関連付けられたタスクバーボタンを持つウィンドウのハンドル。このハンドルは、そのボタンのアプリケーションに関連付けられた呼び出し側プロセスに属し、かつ有効な HWND である必要があります。そうでない場合、呼び出しは無視されます。 |
| hIcon | HICON | in | オーバーレイとして使用するアイコンのハンドル。これは小さなアイコンで、96 dpi で 16x16 ピクセルであるべきです。オーバーレイアイコンがすでにタスクバーボタンに適用されている場合、その既存のオーバーレイは置き換えられます。 この値は NULL にできます。NULL 値がどのように扱われるかは、タスクバーボタンが単一のウィンドウを表すか、ウィンドウのグループを表すかによって異なります。
hIcon が不要になったときに解放するのは、呼び出し側アプリケーションの責任です。タスクバーはアイコンの独自のコピーを作成して使用するため、これは通常 SetOverlayIcon を呼び出した後に行うことができます。 |
| pszDescription | LPWSTR | in | アクセシビリティのために、オーバーレイが伝える情報の代替テキスト版を提供する文字列へのポインター。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
Windows 7 より前のバージョンの Windows では、アプリケーションはタスクバーの通知領域のアイコンを使用して、アプリケーションの状態や通知をユーザーに表示することがよくありました。Windows 7 のタスクバーでは、アプリケーションがタスクバーボタンを通じて同様のユーザーフィードバックを提供でき、より多くのアプリケーション情報が 1 か所に集約されます。これらのオーバーレイは、ショートカットアイコンやセキュリティ通知に使用される既存のオーバーレイと同様のもので、ボタンの右下隅に表示されます。
次の図は、右端のタスクバーボタンに適用されたオーバーレイ (ユーザーの状態が「連絡可能」であることを示す小さな緑の四角) を示しています。
アイコンオーバーレイは状態を文脈的に通知する役割を果たし、その情報をユーザーに伝えるために別個の通知領域の状態アイコンを必要としないようにすることを意図しています。アプリケーション設計者は、開発サイクル中に、アイコンオーバーレイと通知領域の状態アイコンのどちらの方法がそのアプリケーションに最も適しているかを判断する必要があります。オーバーレイアイコンは、ネットワークの状態、メッセンジャーの状態、新着メールなど、重要で長期的な状態や通知を提供することを意図しています。頻繁に変更したり、アニメーション化したりすべきではありません。
オーバーレイアイコンを表示するには、タスクバーが既定の大きいアイコンモードである必要があります。タスク バーと [スタート] メニューのプロパティ を通じて小さいアイコンを表示するようにタスクバーが構成されている場合、オーバーレイは適用できず、このメソッドの呼び出しは無視されます。
単一のオーバーレイは個々のウィンドウのサムネイルではなくタスクバーボタンに適用されるため、これはウィンドウ単位ではなくグループ単位の機能です。オーバーレイアイコンの要求はタスクバーグループ内の個々のウィンドウから受け取ることができますが、キューには入りません。最後に受け取ったオーバーレイが表示されます。最後に受け取ったオーバーレイが削除された場合は、それが置き換えたオーバーレイがまだアクティブであれば、それが復元されます。例として、ウィンドウ 1、2、3 が順にオーバーレイ A、B、C を設定するとします。オーバーレイ C が最後に受け取られたため、タスクバーボタンにはそれが表示されます。ウィンドウ 2 が SetOverlayIcon を NULL 値で呼び出してオーバーレイ B を削除します。次にウィンドウ 3 が同様にしてオーバーレイ C を削除します。ウィンドウ 1 のオーバーレイ A がまだアクティブであるため、その後タスクバーボタンにはそのオーバーレイが表示されます。
Windows エクスプローラーが予期せず終了した場合、Windows エクスプローラーが復元されてもオーバーレイは復元されません。アプリケーションは、Windows エクスプローラーが再起動してタスクバーボタンが再作成されたことを示す TaskbarButtonCreated メッセージの受信を待ってから、SetOverlayIcon を再度呼び出してオーバーレイを再適用する必要があります。
タスクバーボタンのフライアウト内の個々のプレビューサムネイルの上にマウスポインターを置いたときに表示されるツールチップのテキストを指定または更新します。
| hwnd | HWND | in | ツールチップを表示するサムネイルを持つウィンドウのハンドル。このハンドルは呼び出し側プロセスに属している必要があります。 |
| pszTip | LPWSTR | in | ツールチップに表示するテキストへのポインター。この値は NULL にでき、その場合は hwnd で指定されたウィンドウのタイトルがツールチップとして使用されます。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
ウィンドウのクライアント領域の一部を選択し、そのウィンドウのサムネイルとしてタスクバーに表示します。
| hwnd | HWND | in | タスクバーに表されるウィンドウのハンドル。 |
| prcClip | RECT* | in | ウィンドウのクライアント領域内の選択範囲を、そのクライアント領域の左上隅を基準として指定する RECT 構造体へのポインター。すでに設定されているクリップをクリアしてサムネイルの既定の表示に戻すには、このパラメーターを NULL に設定します。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ITaskbarList3 "{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}" #usecom global ITaskbarList3 IID_ITaskbarList3 "{56FDF344-FD6D-11D0-958A-006097C9A090}" #comfunc global ITaskbarList3_SetProgressValue 9 sptr,int64,int64 #comfunc global ITaskbarList3_SetProgressState 10 sptr,int #comfunc global ITaskbarList3_RegisterTab 11 sptr,sptr #comfunc global ITaskbarList3_UnregisterTab 12 sptr #comfunc global ITaskbarList3_SetTabOrder 13 sptr,sptr #comfunc global ITaskbarList3_SetTabActive 14 sptr,sptr,int #comfunc global ITaskbarList3_ThumbBarAddButtons 15 sptr,int,var #comfunc global ITaskbarList3_ThumbBarUpdateButtons 16 sptr,int,var #comfunc global ITaskbarList3_ThumbBarSetImageList 17 sptr,sptr #comfunc global ITaskbarList3_SetOverlayIcon 18 sptr,sptr,wstr #comfunc global ITaskbarList3_SetThumbnailTooltip 19 sptr,wstr #comfunc global ITaskbarList3_SetThumbnailClip 20 sptr,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ITaskbarList3 "{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}" #usecom global ITaskbarList3 IID_ITaskbarList3 "{56FDF344-FD6D-11D0-958A-006097C9A090}" #comfunc global ITaskbarList3_SetProgressValue 9 sptr,int64,int64 #comfunc global ITaskbarList3_SetProgressState 10 sptr,int #comfunc global ITaskbarList3_RegisterTab 11 sptr,sptr #comfunc global ITaskbarList3_UnregisterTab 12 sptr #comfunc global ITaskbarList3_SetTabOrder 13 sptr,sptr #comfunc global ITaskbarList3_SetTabActive 14 sptr,sptr,int #comfunc global ITaskbarList3_ThumbBarAddButtons 15 sptr,int,sptr #comfunc global ITaskbarList3_ThumbBarUpdateButtons 16 sptr,int,sptr #comfunc global ITaskbarList3_ThumbBarSetImageList 17 sptr,sptr #comfunc global ITaskbarList3_SetOverlayIcon 18 sptr,sptr,wstr #comfunc global ITaskbarList3_SetThumbnailTooltip 19 sptr,wstr #comfunc global ITaskbarList3_SetThumbnailClip 20 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。