はじめに
Delphi の VCL フレームワークには Taskbar コンポーネントがあります 1。
使い方
タスクバー関連の各機能の使い方です。
フォームに一つ TTaskbar コンポーネント (Taskbar1) が貼ってある (Taskbar1) ものとして話を進めます。
■ タスクバーボタン
タスクバーボタンのグループ化の制御を行うには Winapi.ShlObj を uses に入れて、SetCurrentProcessExplicitAppUserModelID() API を呼び出します。
詳しくは以下の記事を参照してください。
See also:
■ 進行状況バー (プログレスバー)
進行状況バーを表示するには次のプロパティを設定します。
| プロパティ | 型 | 説明 |
|---|---|---|
| ProgressMaxValue | Int64 | 進捗の最大値 |
| ProgressValue | Int64 | 進捗の現在値 |
| ProgressState | TTaskBarProgressState | 進捗の状態 |
ProgressState に設定できる状態は次の通りです。
進捗や状態を変更した後には ApplyProgressChanges() を呼び出してください。
Taskbar1.ApplyProgressChanges;
See also:
■ オーバーレイアイコン
オーバーレイアイコンを表示するには次のプロパティを設定します。
| プロパティ | 型 | 説明 |
|---|---|---|
| OverlayIcon | TIcon | アイコン (*.ico) |
| OverlayHint | String | ヒント |
OverlayIcon プロパティはオブジェクトインスペクタから *.ico 形式のファイルを読み込ませる事もできますが、例えばシステムストックアイコンを使うには、次のような関数を準備し、
uses
..., Winapi.ShellAPI;
function GetStockIcon(SIID: SHSTOCKICONID): TIcon;
begin
Result := nil;
var sii := Default(TSHStockIconInfo);
sii.cbSize := SizeOf(sii);
if Succeeded(SHGetStockIconInfo(SIID, SHGSI_ICON or SHGSI_SMALLICON, sii)) then
begin
Result := TIcon.Create;
Result.Handle := sii.hIcon;
end;
end;
こんな感じで使います。
procedure TForm1.Button1Click(Sender: TObject);
begin
var StockIcon := GetStockIcon(SIID_ERROR);
try
Taskbar1.OverlayIcon := StockIcon;
Taskbar1.OverlayHint := 'エラー';
Taskbar1.ApplyOverlayChanges;
finally
StockIcon.Free;
end;
end;
オーバーレイアイコンを消すには nil を代入すれば OK です。
procedure TForm1.Button2Click(Sender: TObject);
begin
Taskbar1.OverlayIcon := nil;
Taskbar1.ApplyOverlayChanges;
end;
オーバーレイアイコンを変更した後には ApplyOverlayChanges() を呼び出してください。
Taskbar1.ApplyOverlayChanges;
See also:
■ タスクバーサムネイル (タブ)
ある程度のタスクバーサムネイル (タブ) 処理は最初から VCL の TForm に組み込まれているため、タスクバーサムネイル (タブ) を TTaskbar を使わずに独自処理する事はオススメしません。
・'タブ'(フォーム)を登録してタスクバー プレビューに複数の画像を表示する
プレビューを表示したいフォームに TTaskbar を貼り付けるとフォーム毎にプレビューが表示されます。
プレビューはキャッシュされます。プレビュー内容を任意のタイミングで更新したい場合には ApplyTabsChanges() を呼びます。
Taskbar1.ApplyTabsChanges;
一つのフォームに TTaskbar を複数貼り付けるのはやめておいた方がいいと思います。
・フォームの一部の領域を切り取って表示する
PreviewClipRegion プロパティを設定します。
| プロパティ | 型 | 説明 |
|---|---|---|
| PreviewClipRegion | TPreviewClipRegion | クリッピングする領域 |
クリッピング領域を動的に変更した場合には ApplyClipAreaChanges() を呼びます。
Taskbar1.ApplyClipAreaChanges;
この機能は Windows 11 では利用できないようです。クリッピング領域を指定しても常に全体が描画されます。
Windows 11 では代わりにカスタマイズ描画 (後述) を試してみてください。
・新しい画像を生成して表示
要はサムネイルのカスタマイズ描画です。ミニプレイヤー等を作るのに使えます。
TabProperties.CustomizedPreview を True に設定します。TabProperties の他のオプションとは排他利用となります。
Taskbar1.TabProperties := Taskbar1.TabProperties + [TThumbTabProperty.CustomizedPreview];
CustomizedPreview が True だと OnThumbPreviewRequest および OnWindowPreviewItemRequest のイベントが発生するようになります。ここで独自描画を行う事になります。
| イベント | 説明 |
|---|---|
| OnThumbPreviewRequest | サムネイルの要求 (縮小表示) |
| OnWindowPreviewItemRequest | ライブプレビュー (サムネイルにマウスオーバーした時) の要求 (実寸表示) |
プレビューはキャッシュされます。プレビュー内容を任意のタイミングで更新したい場合には ApplyTabsChanges() を呼びます。
Taskbar1.ApplyTabsChanges;
OnThumbPreviewRequest および OnWindowPreviewItemRequest で描画する BITMAP は 32bit である必要があります。
See also:
・MDI アプリケーションの場合
ドキュメントには
プレビューについては、MDI アプリケーションの場合、子ウィンドウはすべて、プレビューに自動的に追加され、別のウィンドウのように表示されます(Internet Explorer のタブと同様に、複数のタブを開くと、タブごとにミニ ウィンドウがプレビューに表示されます)。
とありますが、実際にはそのような動作になりません。
以前はそうだったのかもしれませんが、現状だとプレビューを表示したい子フォームに TTaskbar を貼り付ける必要があります。
プレビューはキャッシュされます。プレビュー内容を任意のタイミングで更新したい場合には ApplyTabsChanges() を呼びます。
Taskbar1.ApplyTabsChanges;
・TabProperties
TabProperties の設定項目です。
| プロパティ | 排他 | 説明 |
|---|---|---|
| AppThumbAlways | AppThumbWhenActive | 常にサムネイルがプレビューされる |
| AppThumbWhenActive | AppThumbAlways | フォームがアクティブな時だけサムネイルがプレビューされる |
| AppPeekAlways | AppPeekWhenActive | 常にライブプレビューが表示される |
| AppPeekWhenActive | AppPeekAlways | フォームがアクティブな時だけライブプレビューが表示される |
| CustomizedPreview | 他の App 系プロパティ | サムネイルやライブプレビューを独自描画します |
TabProperties の App 系のプロパティを設定するとメインフォームのプレビューが描画されるようになります。メインフォーム以外で TTaskbar を利用している場合には注意してください。
■ サムネイルツールバー
サムネイルツールバー (アイコン) を表示するには次のプロパティを設定します。
| プロパティ | 型 | 説明 |
|---|---|---|
| TaskBarButtons | TThumbBarButtonList | ボタンのリスト |
ボタンが押された時のイベントは OnThumbButtonClick です。
| イベント | 説明 |
|---|---|
| OnThumbButtonClick | ボタンが押された時のイベント |
以下、自 EXE に埋め込まれたアイコンリソースを読み出してボタンを追加するサンプルソースコードです。
procedure TForm1.FormCreate(Sender: TObject);
begin
TThread.ForceQueue(nil,
procedure
begin
var hIconPrev := LoadIcon(HInstance, 'ICON_REWIND');
var hIconNext := LoadIcon(HInstance, 'ICON_FORWARD');
Taskbar1.TaskBarButtons.BeginUpdate;
try
// 前へ (ID = 0)
var BtnPrev := Taskbar1.TaskBarButtons.Add;
BtnPrev.Hint := '前へ';
BtnPrev.Icon.Handle := hIconPrev;
// 次へ (ID = 1)
var BtnNext := Taskbar1.TaskBarButtons.Add;
BtnNext.Hint := '次へ';
BtnNext.Icon.Handle := hIconNext;
finally
Taskbar1.TaskBarButtons.EndUpdate;
Taskbar1.ApplyChanges;
end;
end);
end;
procedure TForm1.Taskbar1ThumbButtonClick(Sender: TObject; AButtonID: Integer);
begin
case AButtonID of
0:
ShowMessage('前へ');
1:
ShowMessage('次へ');
end;
end;
- ボタンの ID はボタンの作成順 (インデックス) です
- ボタンの動的追加の際は BeginUpdate / EndUpdate で括らないとエラーが発生します
- ボタンは動的生成せずに、オブジェクトインスペクタで (事前に) 設定しておくのがいいかと思います
- ボタン画像に BITMAP は使えません
サムネイルツールバーを変更した後には ApplyChanges() を呼び出さないと反映されない事があります。
Taskbar1.ApplyChanges;
コード例のように ForceQueue() を使って登録処理をメッセージキューの最後に突っ込まないとサムネイルツールバーが表示されないかもしれません。
ボタンには状態を表す ButtonState プロパティがあります。
| 列挙値 | API フラグ | 説明 |
|---|---|---|
| Enabled | THBF_ENABLED | ボタンを有効にする。 |
| DismissOnClick | THBF_DISMISSONCLICK | ボタンクリック時にサムネイルを閉じる。 |
| NoBackground | THBF_NOBACKGROUND | ボタン枠等の背景を描画しない。 |
| Hidden | THBF_HIDDEN | ボタンを非表示にする。 |
| NonInteractive | THBF_NONINTERACTIVE | ボタンを通知用のインジケーターとして設定。クリックやマウスオーバーに反応しない。 |
See also:
- 【Delphi】タスクバーサムネイルにサムネイルツールバー (アイコン) を表示する (Qiita)
- Vcl.Taskbar.TThumbBarButtonList (DocWiki)
- Vcl.Taskbar.TThumbBarButton (DocWiki)
■ ジャンプリスト
ジャンプリストは別コンポーネント (TJumpList) で実装されています 2。
詳しくは以下の記事を参照してください。
See also:
■ フルスクリーン時のタスクバー
フルスクリーン時にタスクバーが前面に出てこようとするのを抑制するためのメソッドは TTaskbar には用意されていません。
TWinTaskbar.MarkFullscreenWindow() を使うか、以下の手続きを利用してください。
uses
..., Winapi.ActiveX, Winapi.ShlObj;
procedure MarkFullscreenWindow(aHwnd: HWND; aFullscreen: Boolean);
begin
var LTaskbarList: ITaskbarList2;
if Succeeded(CoCreateInstance(CLSID_TaskbarList, nil, CLSCTX_INPROC_SERVER, IID_ITaskbarList2, LTaskbarList)) then
begin
LTaskbarList.HrInit;
LTaskbarList.MarkFullscreenWindow(aHwnd, LongBool(aFullscreen));
end;
end;
See also:
おわりに
VCL だとタスクバーの機能が簡単に使えますね。
See also:
索引
[ ↑ 目次へ ]









