1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Delphi】Vcl.Taskbar の使い方

1
Last updated at Posted at 2026-10-31

はじめに

Delphi の VCL フレームワークには Taskbar コンポーネントがあります 1。

image.png

使い方

タスクバー関連の各機能の使い方です。

フォームに一つ TTaskbar コンポーネント (Taskbar1) が貼ってある (Taskbar1) ものとして話を進めます。

image.png

■ タスクバーボタン

タスクバーボタンのグループ化の制御を行うには Winapi.ShlObj を uses に入れて、SetCurrentProcessExplicitAppUserModelID() API を呼び出します。

詳しくは以下の記事を参照してください。

See also:

■ 進行状況バー (プログレスバー)

進行状況バーを表示するには次のプロパティを設定します。

プロパティ 型 説明
ProgressMaxValue Int64 進捗の最大値
ProgressValue Int64 進捗の現在値
ProgressState TTaskBarProgressState 進捗の状態

ProgressState に設定できる状態は次の通りです。

アイコン 列挙値 説明
image.png TTaskBarProgressState.None 進捗表示なし (アクティブ)
image.png TTaskBarProgressState.Indeterminate 処理中&マーキー表示 (進捗不明)
image.png TTaskBarProgressState.Normal 処理中&進捗表示
image.png TTaskBarProgressState.Paused 中断中&再開待ち
image.png TTaskBarProgressState.Error 中断中&再開不能

進捗や状態を変更した後には 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 を貼り付けるとフォーム毎にプレビューが表示されます。

image.png

プレビューはキャッシュされます。プレビュー内容を任意のタイミングで更新したい場合には 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 のタブと同様に、複数のタブを開くと、タブごとにミニ ウィンドウがプレビューに表示されます)。

とありますが、実際にはそのような動作になりません。

image.png

以前はそうだったのかもしれませんが、現状だとプレビューを表示したい子フォームに 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;

image.png

  • ボタンの 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:

■ ジャンプリスト

ジャンプリストは別コンポーネント (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:

索引

[ ↑ 目次へ ]

  1. Delphi XE6 以降。 ↩

  2. Delphi XE7 以降。 ↩

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?