タスク バー

Windows インターフェイスには、タスク バーと呼ばれる特別なアプリケーション デスクトップ ツール バーが含まれています。 タスク バーは、開いているウィンドウの切り替えや新しいアプリケーションの起動などのタスクに使用できます。

注意

Windows 7 の時点でタスク バーに加えられた変更については、「 タスク バー拡張機能」を参照してください。

 

このトピックは、次のセクションで構成されています。

タスク バーについて

タスク バーには、次のものが含まれます。

  • [スタート ] メニュー
  • サイド リンク バー (Windows Vista 以前のみ)
  • タスク バーのボタン
  • ツール バー (省略可能)
  • [通知] 領域

[スタート] メニューには、プログラム、ドキュメント、設定にアクセスできるコマンドが含まれています。 これらのコマンドには、すべてのプログラムドキュメントコントロール パネルゲームヘルプとサポートシャットダウンおよび検索プログラムとファイルが含まれます。

以前のバージョンの Windows の [スタート] には 、[検索実行] などの項目が含まれていました。この機能は、Windows Vista 以降の 検索プログラムとファイル に含まれていました。

Windows 7 より前のバージョンの Windows で使用できるサイド リンク バーには、アプリケーションへのショートカットが含まれています。 Windows には、Windows インターネット エクスプローラーなどの既定のエントリが用意されており、ユーザーは選択したショートカットをさらに追加できます。 この領域のアイコンは、1 回のクリックに応答します。 Windows 7 以降では、この機能はタスク バー ボタンに含まれています。

シェルは、アプリケーションが未所有のウィンドウ (親を持たないウィンドウ、適切な拡張スタイル ビットを持つウィンドウ) を作成するたびに、タスク バーにボタンを配置します (下記の「 タスク バー ボタンの管理」を参照)。 ウィンドウに切り替えるには、ユーザーがそのウィンドウ ボタンをクリックします。 この機能は、Windows 7 の時点で大幅に拡張されています。 詳細については、「 タスク バーの拡張機能」を参照してください。

アプリケーションは、操作の状態を示したり、イベントについてユーザーに通知したりするために、通知領域にアイコンを配置できます。 たとえば、アプリケーションが通知領域にプリンター アイコンを配置して、印刷ジョブが進行中であることを示す場合があります。 ただし、Windows 7 以降では、通知領域で以前に提供された情報の一部は、アプリケーションのタスク バー ボタンを使用して提供する必要があります。 通知領域は、タスク バーの右端 (タスク バーが水平の場合) または下部 (タスク バーが垂直の場合) にあります。 詳細については、「 通知と通知領域」を参照してください。

そのオプションが選択されている場合は、通知領域にも現在の時刻が表示されます。 オプションは次のように見つかります。

  • Windows 7 以降: 通知領域アイコン コントロール パネル アプリケーションの [システム アイコンのオンとオフを切り替える] ページの [時計] ドロップダウン リスト (通知領域のプロパティからもアクセスできます)。
  • Windows Vista: タスク バーとスタート メニューのプロパティ ウィンドウの [通知領域] ページの [時計のチェック] ボックス。
  • Windows XP: [タスク バーとスタート メニューのプロパティ] ウィンドウの [時計のチェックを表示する] ボックス。

ユーザーはタスク バーを右クリックしてショートカット メニューを表示できます。 ショートカット メニューには、ウィンドウ、スタック ウィンドウのカスケード、ウィンドウの並べて表示、デスクトップの表示、タスク マネージャーの起動、タスク バーのプロパティの設定を行うコマンドが含まれています。 ショートカット メニューには、タスク バーから一連のツール バーを追加または削除するオプションも用意されています。 新しいツール バーをこのメニューに追加するには、CATID_DeskBand カテゴリに登録します。 詳細については、「 バンド オブジェクトの実装」を参照してください。 Windows 7 の時点では、タスク バーと通知領域には個別のショートカット メニューがあることに注意してください。 これらのショートカット メニューは、ウィンドウの配置など、いくつかのオプションを共有し、他のオプションを追加します。

タスク バーの表示オプション

タスク バーでは、2 つの表示オプションがサポートされています。自動非表示と、Windows Vista 以前の場合のみ、Always On Top (タスク バーは常に Windows 7 以降ではこのモードです)。 これらのオプションを設定するには、タスク バーのショートカット メニューを開き、[プロパティ] をクリックし、[タスク バーのチェックを自動非表示にする] ボックスまたは [タスク バーを他のウィンドウの上に保持する] チェック ボックスをオンまたはオフにする必要があります。 これらの表示オプションの状態を取得するには、 ABM_GETSTATE メッセージを使用します。 これらの表示オプションの状態が変更されたときに通知を受け取る場合は、ウィンドウ プロシージャで ABN_STATECHANGE 通知メッセージを処理します。 これらの表示オプションの状態を変更するには、 ABM_SETSTATE メッセージを使用します。

作業領域は、タスク バーによって隠されない画面の部分です。 作業領域のサイズを取得するには、SPI_GETWORKAREA値を設定して SystemParametersInfo 関数を呼び出します。 タスク バーの場所を表す四角形の座標を取得するには、 ABM_GETTASKBARPOS メッセージを使用します。

SetWindowPos を使用して、ウィンドウの四角形のサイズを画面のサイズと同じサイズに明示的に設定することで、タスク バーをカバーできます。 Windows 2000 以降のシステムでは、ウィンドウに WS_CAPTION または WS_THICKFRAMEがない必要があります。そうしないと、クライアント領域が画面全体を覆えるようにウィンドウのサイズを変更する必要があります。 これらのシステムにも特に、タスク バーが Always On Top に設定されている場合、アプリケーションがフォアグラウンド アプリケーションの間だけ非表示になります。

スタート メニューへのショートカットの追加

Microsoft Windows NT 4.0、Windows 2000 以降、または Windows 95 以降の [プログラム] サブメニューに項目を追加するには、次の手順に従います。

  1. IShellLink インターフェイスを使用してシェル リンクを作成します。
  2. SHGetSpecialFolderLocation を使用し、CSIDL_PROGRAMS渡して Programs フォルダーの PIDL 取得します。
  3. [プログラム] フォルダーにシェル リンクを追加します。 [プログラム] フォルダーにフォルダーを作成し、そのフォルダーへのリンクを追加することもできます。

タスク バー ボタンの管理

アプリケーションが所有していないウィンドウを作成するたびに、シェルによってタスク バーにボタンが作成されます。 ウィンドウ ボタンがタスク バーに確実に配置されるようにするには、 WS_EX_APPWINDOW 拡張スタイルの未所有のウィンドウを作成します。 ウィンドウ ボタンがタスク バーに配置されないようにするには、 WS_EX_TOOLWINDOW拡張スタイル を使用して未所有のウィンドウを作成します。 別の方法として、非表示ウィンドウを作成し、この非表示ウィンドウを表示ウィンドウの所有者にすることができます。

シェルは、ウィンドウのスタイルが表示されるタスク バー ボタンをサポートしている場合にのみ、タスク バーからウィンドウのボタンを削除します。 ウィンドウのスタイルを、表示可能なタスク バー ボタンをサポートしていないスタイルに動的に変更する場合は、最初にウィンドウを非表示にする必要があります (SW_HIDEShowWindow を呼び出し、ウィンドウ スタイルを変更して、ウィンドウを表示します。

ウィンドウ ボタンには、通常、アプリケーション アイコンとタイトルが含まれます。 ただし、アプリケーションにシステム メニューが含まれていない場合は、アイコンなしでウィンドウ ボタンが作成されます。

ウィンドウがアクティブでないときにアプリケーションでユーザーの注意を引く場合は、 FlashWindow 関数を使用して、メッセージが待機していることをユーザーに知らせます。 この関数は、ウィンドウ ボタンを点滅させます。 ユーザーがウィンドウ ボタンをクリックしてウィンドウをアクティブ化すると、アプリケーションでメッセージを表示できます。

タスク バーの内容の変更

バージョン 4.71 以降 のShell32.dllでは、タスク バーの内容を変更する機能が追加されています。 アプリケーションからタスク バー ボタンを追加、削除、アクティブ化できるようになりました。 アイテムをアクティブ化しても、ウィンドウはアクティブになりません。タスク バーに押された状態で項目が表示されます。

タスク バーの変更機能は、 ITaskbarList インターフェイス (IID_ITaskbarList) を公開するコンポーネント オブジェクト モデル (COM) オブジェクト (CLSID_TaskbarList) に実装されます。 オブジェクトを初期化するには、 ITaskbarList::HrInit メソッドを呼び出す必要があります。 その後、 ITaskbarList インターフェイスのメソッドを使用して、タスク バーの内容を変更できます。

通知領域でのアイコンの追加、変更、および削除

Shell_NotifyIcon関数を使用して、通知領域にアイコンを追加、変更、または削除します。 Shell_NotifyIcondwMessage パラメーターは、実行するアクションを指定するタスク バーへのメッセージです。 pnid パラメーターは、アイコンを識別し、システムがメッセージを処理するために必要な追加情報を渡すために使用される NOTIFYICONDATA 構造体へのポインターです。

通知領域アイコンを使用して、次のアクションを実行できます。

  • タスク バーの通知領域にアイコンを追加するには、dwMessage パラメーターを NIM_ADD に設定して Shell_NotifyIcon を呼び出します。 NOTIFYICONDATA 構造体は、アイコンのハンドルと識別子、およびツールヒント テキストを指定するために使用されます。 タスク バーのプロパティでユーザーが [時計の表示] チェック ボックスを選択した場合、システムはアイコンを時計の左側に配置します。 それ以外の場合は、アイコンが右側またはタスク バーの下部に表示されます。 既存のアイコンはすべて左に移動して、新しいアイコンのスペースを作ります。
  • アイコン ハンドル、ヒント テキスト、コールバック メッセージ識別子など、アイコンの情報を変更するには、dwMessage を NIM_MODIFY に設定してShell_NotifyIconを呼び出します。
  • 通知領域からアイコンを削除するには、dwMessage パラメーターを NIM_DELETE に設定してShell_NotifyIconを呼び出します。

ユーザー インターフェイス操作が完了したら、dwMessage を NIM_SETFOCUS に設定して Shell_NotifyIcon を呼び出して、通知領域にフォーカスを戻します。 たとえば、タスク バー アイコンにショートカット メニューが表示されているのに、ユーザーが ESCAPE キーを押してキャンセルした場合にこれを行うことができます。

通知領域コールバック メッセージの受信

アプリケーションは、通常、タスク バーの通知領域にアイコンを配置して、ステータス インジケーターとして機能します。 マウス ポインターをアイコンの上に移動したり、アイコンをクリックしたりするなど、ユーザーがマウス操作を実行するときに追加情報を提供できます。

システムは、特定のアイコンに関連付けられているアプリケーション定義のコールバック メッセージを送信することで、マウスイベントとキーボードイベントを通知します。 これにより、ユーザーがアイコンをクリックしたり、キーを押して選択したりしたときに、システムはアプリケーションに通知できます。

アイコンをタスク バーに追加するときに、アイコンのコールバック メッセージを定義します。 コールバック メッセージ識別子は、NIM_ADDで渡される NOTIFYICONDATA 構造体の uCallbackMessage メンバーで指定されます。 イベントが発生すると、 システムは hWnd メンバーによって指定されたウィンドウのウィンドウ プロシージャにコールバック メッセージを送信します。 メッセージの wParam パラメーターには、イベントが発生したタスク バー アイコンの識別子が含まれています。 lParam パラメーターは、イベントに関連付けられたマウスまたはキーボード メッセージを保持します。 たとえば、マウス ポインターがタスク バー アイコンに移動すると、 lParam にはWM_MOUSEMOVEが含 まれます

さまざまなマウス イベントの結果は、次のように要約できます。

  • ユーザーがマウス ポインターをアイコンの上に移動すると、 NOTIFYICONDATA で指定されたツールヒント テキストが表示されます。
  • ユーザーがアイコンをクリックすると、アプリケーションは WM_LBUTTONDOWN 通知を受け取ります。
  • ユーザーがアイコンを右クリックすると、アプリケーションは WM_RBUTTONDOWN 通知を受け取ります。
  • ユーザーがアイコンをダブルクリックすると、アプリケーションは WM_LBUTTONDBLCLK 通知を受け取ります。

通常、アイコンをクリックすると、アプリケーションに追加情報を含むウィンドウが表示され、右クリックするとショートカット メニューが表示され、ダブルクリックすると既定のショートカット メニュー コマンドが実行されます。

通知領域アイコンに関連付けられているヒント テキストを変更する方法の例については、「 ステータス バー アイコンのバルーン ヒント」を参照してください。

シェルのバージョン 5.0 以降ではWindows NT 4.0、Windows 95、Windows 98 で見つかった以前のシェル バージョンとは異なる方法で、マウスとキーボードのイベントShell_NotifyIcon処理されます。 相違点は、次のとおりです。

  • ユーザーがキーボードを使用して通知アイコンのショートカット メニューを要求した場合、バージョン 5.0 シェルは関連付けられたアプリケーションに WM_CONTEXTMENU メッセージを送信します。 以前のバージョンでは、 WM_RBUTTONDOWNWM_RBUTTONUPメッセージが 送信されます。
  • ユーザーがキーボードで通知アイコンを選択し、スペース バーまたは Enter キーでアクティブ化すると、バージョン 5.0 シェルは関連付けられたアプリケーション にNIN_KEYSELECT 通知を送信します。 以前のバージョンでは、 WM_RBUTTONDOWNWM_RBUTTONUPメッセージが 送信されます。
  • ユーザーがマウスで通知アイコンを選択し、Enter キーを使用してアクティブ化すると、バージョン 5.0 シェルは関連付けられたアプリケーションに NIN_SELECT 通知を送信します。 以前のバージョンでは、 WM_RBUTTONDOWNWM_RBUTTONUPメッセージが 送信されます。
  • ユーザーがバルーン ヒントが関連付けられているアイコンの上にマウス ポインターを渡すと、バージョン 6.0 Shell (Windows XP) は次のメッセージを送信します。
      • NIN_BALLOONSHOW - バルーンが表示されたときに送信されます (バルーンはキューに入れられます)。
      • NIN_BALLOONHIDE - バルーンが消えたとき (アイコンが削除されたときなど) に送信されます。 タイムアウトまたはマウス クリックのためにバルーンが閉じられた場合、このメッセージは送信されません。
      • NIN_BALLOONTIMEOUT - タイムアウトのためバルーンが閉じられたときに送信されます。
      • NIN_BALLOONUSERCLICK - マウス クリックによってバルーンが閉じられたときに送信されます。

シェルの動作方法を選択するには、dwMessageNIM_SETVERSIONに設定して Shell_NotifyIcon を呼び出します。 NOTIFYICONDATA 構造体の uVersion メンバーを設定して、バージョン 5.0 またはバージョン 5.0 より前の動作を指定します。

タスク バーの作成通知

Microsoft Internet エクスプローラー 4.0 以降では、シェルはタスク バーが作成されたことをアプリケーションに通知します。 タスク バーが作成されると、タスク バーの作成文字列にメッセージが登録され、このメッセージがすべての最上位ウィンドウにブロードキャストされます。 タスク バー アプリケーションがこのメッセージを受信すると、追加したタスク バー アイコンが削除されたと想定し、再度追加する必要があります。 この機能は通常、シェルの起動時に既に実行されているサービスにのみ適用されます。 次の例は、このケースを処理するための非常に簡略化されたメソッドを示しています。

Windows 10、プライマリ ディスプレイの DPI が変更されると、タスク バーでもこのメッセージがブロードキャストされます。

LRESULT CALLBACK WndProc(HWND hWnd, 
                         UINT uMessage, 
                         WPARAM wParam, 
                         LPARAM lParam)
{
    static UINT s_uTaskbarRestart;

    switch(uMessage)
    {
        case WM_CREATE:
            s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
            break;
        
        default:
            if(uMessage == s_uTaskbarRestart)
                AddTaskbarIcons();
            break;
    }

    return DefWindowProc(hWnd, uMessage, wParam, lParam);
}

タスク バーの使用

このセクションには、タスク バーの通知領域にアイコンを追加する方法と、タスク バー アイコンのコールバック メッセージを処理する方法を示す例が含まれています。

通知領域でのタスク バー アイコンの追加と削除

タスク バーの通知領域にアイコンを追加するには、NOTIFYICONDATA 構造体を入力し、dwMessage を NIM_ADD に設定したShell_NotifyIconに構造体を渡します。 構造体メンバーは、アイコンを追加するウィンドウへのハンドルと、アイコン識別子とアイコン ハンドルを指定する必要があります。 アイコンのツールヒント テキストを指定することもできます。 アイコンのマウス メッセージを受信する必要がある場合は、システムがウィンドウ プロシージャにメッセージを送信するために使用するコールバック メッセージの識別子を指定します。

次の例の関数は、タスク バーにアイコンを追加する方法を示しています。

// MyTaskBarAddIcon - adds an icon to the notification area. 
// Returns TRUE if successful, or FALSE otherwise. 
// hwnd - handle to the window to receive callback messages 
// uID - identifier of the icon 
// hicon - handle to the icon to add 
// lpszTip - tooltip text 

BOOL MyTaskBarAddIcon(HWND hwnd, UINT uID, HICON hicon, LPSTR lpszTip) 
{ 
    BOOL res; 
    NOTIFYICONDATA tnid; 
 
    tnid.cbSize = sizeof(NOTIFYICONDATA); 
    tnid.hWnd = hwnd; 
    tnid.uID = uID; 
    tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
    tnid.uCallbackMessage = MYWM_NOTIFYICON; 
    tnid.hIcon = hicon; 
    if (lpszTip) 
        hr = StringCbCopyN(tnid.szTip, sizeof(tnid.szTip), lpszTip, 
                           sizeof(tnid.szTip));
        // TODO: Add error handling for the HRESULT.
    else 
        tnid.szTip[0] = (TCHAR)'\0'; 
 
    res = Shell_NotifyIcon(NIM_ADD, &tnid); 
 
    if (hicon) 
        DestroyIcon(hicon); 
 
    return res; 
}

タスク バーの通知領域からアイコンを削除するには、NOTIFYICONDATA 構造体に入力し、dwMessageを NIM_DELETE に設定してShell_NotifyIconを呼び出します。 タスク バー アイコンを削除する場合は、構造体の cbSizehWndおよび uID メンバーのみを指定します。 次に例を示します。

// MyTaskBarDeleteIcon - deletes an icon from the notification area. 
// Returns TRUE if successful, or FALSE otherwise. 
// hwnd - handle to the window that added the icon. 
// uID - identifier of the icon to delete. 

BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID) 
{ 
    BOOL res; 
    NOTIFYICONDATA tnid; 
 
    tnid.cbSize = sizeof(NOTIFYICONDATA); 
    tnid.hWnd = hwnd; 
    tnid.uID = uID; 
         
    res = Shell_NotifyIcon(NIM_DELETE, &tnid); 
    return res; 
}

マウス イベントの受信

タスク バー アイコンのコールバック メッセージを指定すると、アイコンの外接する四角形でマウス イベントが発生するたびに、システムによってアプリケーションにメッセージが送信されます。 メッセージの wParam パラメーターはタスク バー アイコンの識別子を指定し、メッセージの lParam パラメーターは、システムがマウス イベントの結果として生成したメッセージを指定します。

次の例の関数は、バッテリー アイコンとプリンター アイコンの両方をタスク バーに追加するアプリケーションの関数です。 アプリケーションは、コールバック メッセージを受信したときに 関数を呼び出します。 この関数は、ユーザーがアイコンの 1 つをクリックしたかどうかを判断し、クリックが発生した場合は、アプリケーション定義関数を呼び出して状態情報を表示します。

// On_MYWM_NOTIFYICON - processes callback messages for taskbar icons. 
// wParam - first message parameter of the callback message. 
// lParam - second message parameter of the callback message. 

void On_MYWM_NOTIFYICON(WPARAM wParam, LPARAM lParam) 
{ 
    UINT uID; 
    UINT uMouseMsg; 
 
    uID = (UINT) wParam; 
    uMouseMsg = (UINT) lParam; 
 
    if (uMouseMsg == WM_LBUTTONDOWN) 
    { 
        switch (uID) 
        { 
            case IDI_MYBATTERYICON: 
 
                // The user clicked the battery icon. Display the 
                // battery status. 
                ShowBatteryStatus(); 
                break; 
 
            case IDI_MYPRINTERICON: 
 
                // The user clicked the printer icon. Display the 
                // status of the print job. 
                ShowJobStatus(); 
                break; 
 
            default: 
                break; 
        } 
     } 

     return; 
 }