タスクトレイへのアイコン追加

タスクバーの横にあるアイコン群を格納したタスクトレイ。各種のドライバや常駐的なソフトのアイコンが登録され、マウスでクリックするとメニューが出てきたりしますね。今回は、あのタスクトレイに独自のアイコンを登録し、マウスのイベントを捕捉してみました。

アイコン登録とマウスイベント

 タスクトレイにアイコンを追加するのは簡単で、アイコンの情報をまとめたNOTIFYICONDATA構造体をShell_NotifyIcon()に渡すだけです。流れとしては、アイコンのHICONを取得し、そのHICONNOTIFYICONDATA構造体を設定してShell_NotifyIcon()を呼び出す、という感じになります。

  /* タスクトレイに追加するアイコンのハンドルを取得 */
  hIcon=LoadIcon(NULL,IDI_APPLICATION);

  /* NOTIFYICONDATA設定 */
  icdata.cbSize=sizeof(NOTIFYICONDATA);
  icdata.hWnd=hwnd;
  icdata.uID=0;
  icdata.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
  icdata.uCallbackMessage=WM_USER;
  icdata.hIcon=hIcon;
  CopyMemory(icdata.szTip,"Test",5);

  /* タスクトレイにアイコン追加 */
  Shell_NotifyIcon(NIM_ADD,&icdata);

 今回の例では、システムからアプリケーション用のアイコンを取得し、そのハンドルhIconNOTIFYICONDATA構造体icdataに設定しています。NOTIFYICONDATA構造体の各メンバは、hWndがコールバックのメッセージが来るウインドウハンドル、uIDがアイコンを識別するID(複数のアイコンを追加する場合は、このIDで識別できるようです)、フラグに有効なメンバ、uCallbackMessageにアイコンでイベントが起きた時に送るメッセージ、hIconにアイコンのハンドル、szTipにアイコン上でマウスを止めた時に表示するツールチップ文字列(表示する場合)となっています。

 今回は、アイコンのイベントをメインウインドウhwndWM_USERを送って通知するようにしました。

	case WM_USER: /* タスクトレイのアイコンメッセージ */

		switch(lParam) {

		case WM_LBUTTONDOWN: /* 左ボタンクリック */

			MessageBox(hwnd,"左クリック","アイコンメッセージ",MB_OK);

			break;

		}

 アイコンのメッセージ処理では、まずlParamに入っているメッセージの種類で処理を振り分けます。今回は左ボタンクリック時にメッセージボックスを出してみましたが、実際に使う時には右クリックでポップアップメニュー、左クリックでアプリケーションのウインドウ表示、という感じになるでしょう。

プログラム

 実行すると、アプリケーションの標準アイコンをロードし、そのアイコンをタスクトレイに追加します。あとは、タスクトレイ内のアイコンを左クリックするとメッセージを出して、終了時にアイコンを削除するようにしました。

プログラムソース表示


Windowsプログラミング実験室 > プログラミング資料庫