タスクトレイのアイコンを操作するには Shell_NotifyIcon() 関数を使います。
この関数の第一引数に NIM_ADD、NIM_DELETE、NIM_MODIFY のいずれかを指定して、第二引数に NOTIFYICONDATA 構造体へのポインタを渡します。
なお NOTIFYICONDATA 構造体には、いろいろと情報をセットしてから Shell_NotifyIcon() 関数を実行します。(戻る)
プロトタイプ宣言
BOOL Shell_NotifyIcon( DWORD dwMessage, // 送信メッセージ PNOTIFYICONDATA lpData // NOTIFYICONDATA 構造体 );
構造体
typedef struct _NOTIFYICONDATA { DWORD cbSize; // この構造体のサイズ HWND hWnd; // ウインドウ・ハンドル UINT uID; // アイコンの識別コード UINT uFlags; // 有効メンバのスイッチ UINT uCallbackMessage; // 通知するメッセージ HICON hIcon; // アイコン・ハンドル TCHAR szTip[ 64 ]; // チップヘルプの文字列 : (省略) : } NOTIFYICONDATA, *PNOTIFYICONDATA;
- この構造体には、バージョンによってかなりメンバ変数が追加・変更されてます。
- 上記の構造体は、バージョンに影響されない共通メンバの部分のみです。
タスクトレイ・アイコンの追加
// 記号定数 #define ID_TRAYICON (1) // 複数のアイコンを識別するためのID定数 #define WM_TASKTRAY (WM_APP + 1) // タスクトレイのマウス・メッセージ定数 // 構造体のセット NOTIFYICONDATA nid = { 0 }; nid.cbSize = sizeof(NOTIFYICONDATA); nid.uFlags = (NIF_ICON | NIF_MESSAGE | NIF_TIP); nid.hWnd = hWnd; // ウインドウのハンドル nid.hIcon = hIcon; // アイコンのハンドル nid.uID = ID_TRAYICON; // アイコン識別子の定数 nid.uCallbackMessage = WM_TASKTRAY; // 通知メッセージの定数 lstrcpy( nid.szTip, TEXT("文字列") ); // チップヘルプの文字列 // ここでアイコンの追加 Shell_NotifyIcon( NIM_ADD, &nid );
- 最低でも構造体の cbSize、uFlags、hWnd、hIcon、uID、uCallbackMessage メンバに必要な情報をセットします。
- タスクトレイ・アイコンにマウスを乗せるとツールチップを表示したい場合は szTip メンバにも文字列をセットします。
なお、この文字列は、最大63文字までですので気をつけましょう。 - 構造体にデータをセットしたら NIM_ADD 定数を指定して Shell_NotifyIcon 関数を呼び出します。
タスクトレイ・アイコンの削除
// 記号定数 #define ID_TRAYICON (1) // 複数のアイコンを識別するためのID定数 #define WM_TASKTRAY (WM_APP + 1) // タスクトレイのマウス・メッセージ定数 // 構造体のセット NOTIFYICONDATA nid = { 0 }; nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; // ウインドウのハンドル nid.uID = ID_TRAYICON; // アイコン識別子の定数 // ここでアイコンの削除 Shell_NotifyIcon( NIM_DELETE, &nid );
- 最低でも構造体の cbSize、hWnd、uID メンバに必要な情報をセットします。
- 構造体の uFlags、hIcon、uCallbackMessage、szTip メンバに情報があっても参照しません。
- 構造体にデータをセットしたら NIM_DELETE 定数を指定して Shell_NotifyIcon 関数を呼び出します。
タスクトレイ・アイコンの変更
// 記号定数 #define ID_TRAYICON (1) // 複数のアイコンを識別するためのID定数 #define WM_TASKTRAY (WM_APP + 1) // タスクトレイのマウス・メッセージ定数 // 構造体のセット NOTIFYICONDATA nid = { 0 }; nid.cbSize = sizeof(NOTIFYICONDATA); nid.uFlags = (NIF_ICON | NIF_MESSAGE | NIF_TIP); nid.hWnd = hWnd; // ウインドウのハンドル nid.hIcon = hIcon; // アイコンのハンドル nid.uID = ID_TRAYICON; // アイコン識別子の定数 nid.uCallbackMessage = WM_TASKTRAY; // 通知メッセージの定数 lstrcpy( nid.szTip, TEXT("文字列") ); // チップヘルプの文字列 // ここでアイコンの変更 Shell_NotifyIcon( NIM_MODIFY, &nid );
- 基本的にアイコンの追加と同じメンバに必要な情報をセットします。
- 最低でも構造体の cbSize、uFlags、hWnd、hIcon、uID、uCallbackMessage メンバに必要な情報をセットします。
- タスクトレイ・アイコンにマウスを乗せるとツールチップを表示したい場合は szTip メンバにも文字列をセットします。
なお、この文字列は、最大63文字までですので気をつけましょう。 - 構造体にデータをセットしたら NIM_MODIFY 定数を指定して Shell_NotifyIcon 関数を呼び出します。
追加・削除・変更の解説
- hWnd に関連付けるウインドウ・ハンドルを指定します。
- hIcon に表示させるアイコン・ハンドルを指定します。
- 1つのアプリケーションで複数のタスクトレイのアイコンを使いたい場合には ID_TRAYICON 定数で振り分けます。
このアイコン識別子の値を変えれば、複数のアイコンを操作(追加・削除・変更)できます。
1つのソフトで1つのアイコンしか使わない場合には、いつも同じ値でもいいでしょう。 - また WM_TASKTRAY はユーザが定義したウインドウ・メッセージです。
これを使ってプロシージャ関数でタスクトレイの処理を行います。
タスクトレイ・アイコンのメッセージ処理
タスクトレイ・アイコン上でマウス・イベントが発生すると指定のウインドウにユーザ定義メッセージ(WM_TASKTRAY)が届きます。
このメッセージは Shell_NotifyIcon() 関数で追加したときの uCallbackMessage メンバの定数値をプロシージャに送ります。
またメッセージ処理内では wParam にアイコン識別コード(uID)、lParam にはマウス・メッセージ(WM_RBUTTONDOWNなど)が渡されます。
メッセージ処理内では、マウスの座標が分からないので必要なときは GetCursorPos() 関数などで取得する必要があります。
// 記号定数 #define ID_TRAYICON (1) // 複数のアイコンを識別するためのID定数 #define WM_TASKTRAY (WM_APP + 1) // タスクトレイのマウス・メッセージ定数 // メッセージの処理 case WM_TASKTRAY: if ( wParam == ID_TRAYICON ){ // アイコンの識別コード switch ( lParam ){ case WM_MOUSEMOVE: /* マウス移動の処理 */ break; case WM_LBUTTONUP: /* 左ボタンが離された処理 */ break; case WM_RBUTTONUP: /* 右ボタンが離された処理 */ break; case WM_MBUTTONUP: /* 中ボタンが離された処理 */ break; case WM_LBUTTONDOWN: /* 左ボタンが押された処理 */ break; case WM_RBUTTONDOWN: /* 右ボタンが押された処理 */ break; case WM_MBUTTONDOWN: /* 中ボタンが押された処理 */ break; case WM_LBUTTONDBLCLK: /* 左ダブルクリックされた処理 */ break; case WM_RBUTTONDBLCLK: /* 右ダブルクリックされた処理 */ break; case WM_MBUTTONDBLCLK: /* 中ダブルクリックされた処理 */ break; default: /* 上記以外の処理 */ break; } } break;
- 複数のタスクトレイ・アイコンを処理する場合は wParam 引数からアイコンの識別コードをチェックして分岐します。
- 上記のサンプルで必要なアクションのマウス・メッセージなどに処理を記述して下さい。
例えば右ボタンが離された時(WM_RBUTTONUP)にポップアップ・メニューを表示させるなら TrackPopupMenu() 関数を記述します。 - 必要がない場合は、特に記述しないか、マウス・メッセージの WM_xxxxx を省略できます。