タスクバーの横にあるアイコン群を格納したタスクトレイ。各種のドライバや常駐的なソフトのアイコンが登録され、マウスでクリックするとメニューが出てきたりしますね。今回は、あのタスクトレイに独自のアイコンを登録し、マウスのイベントを捕捉してみました。 アイコン登録とマウスイベントタスクトレイにアイコンを追加するのは簡単で、アイコンの情報をまとめたNOTIFYICONDATA構造体をShell_NotifyIcon()に渡すだけです。流れとしては、アイコンのHICONを取得し、そのHICONでNOTIFYICONDATA構造体を設定して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); 今回の例では、システムからアプリケーション用のアイコンを取得し、そのハンドルhIconをNOTIFYICONDATA構造体icdataに設定しています。NOTIFYICONDATA構造体の各メンバは、hWndがコールバックのメッセージが来るウインドウハンドル、uIDがアイコンを識別するID(複数のアイコンを追加する場合は、このIDで識別できるようです)、フラグに有効なメンバ、uCallbackMessageにアイコンでイベントが起きた時に送るメッセージ、hIconにアイコンのハンドル、szTipにアイコン上でマウスを止めた時に表示するツールチップ文字列(表示する場合)となっています。 今回は、アイコンのイベントをメインウインドウhwndにWM_USERを送って通知するようにしました。 case WM_USER: /* タスクトレイのアイコンメッセージ */ switch(lParam) { case WM_LBUTTONDOWN: /* 左ボタンクリック */ MessageBox(hwnd,"左クリック","アイコンメッセージ",MB_OK); break; } アイコンのメッセージ処理では、まずlParamに入っているメッセージの種類で処理を振り分けます。今回は左ボタンクリック時にメッセージボックスを出してみましたが、実際に使う時には右クリックでポップアップメニュー、左クリックでアプリケーションのウインドウ表示、という感じになるでしょう。 プログラム実行すると、アプリケーションの標準アイコンをロードし、そのアイコンをタスクトレイに追加します。あとは、タスクトレイ内のアイコンを左クリックするとメッセージを出して、終了時にアイコンを削除するようにしました。 |