タスクトレイにアイコンを表示する方法
① アイコンの表示を開始したいタイミングで、Shell_NotifyIcon関数をNIM_ADDで呼び出す
② メッセージループに「タスクトレイのアイコンにアクションがあった」という単位でメッセージが届くので、処理する
③ アイコンを消したいタイミングで、Shell_NotifyIcon関数をNIM_DELETEで呼び出す
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { static const decltype(WM_USER) WM_NOTIFYICON = WM_USER + 100; static const int IconID = 100; switch (msg) { case WM_LBUTTONDOWN://ウィンドウをクリックしたらアイコン表示開始 { NOTIFYICONDATA nid; nid.cbSize = sizeof(nid); nid.hWnd = hwnd; nid.uID = IconID;//複数のアイコンを表示したときの識別ID。なんでもいい。 nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nid.uCallbackMessage = WM_NOTIFYICON; //WM_USER以降の定数。 nid.hIcon = (HICON)LoadIcon(NULL, IDI_APPLICATION); _tcscpy(nid.szTip, _T("タスクトレイで表示する文字列")); int ret = (int)Shell_NotifyIcon(NIM_ADD, &nid); ShowWindow(hwnd, SW_HIDE); } break; case WM_NOTIFYICON: if (wp == IconID && lp == WM_LBUTTONDOWN) { //アイコンに対する操作がWM_LBUTTONDOWNでアイコンのIDがIconIDなら以下の処理: ShowWindow(hwnd, SW_SHOW); //タスクトレイアイコンを削除 //////////////////////////////////////// NOTIFYICONDATA nid; nid.cbSize = sizeof(nid); nid.hWnd = hwnd; nid.uID = IconID; nid.uFlags = 0; Shell_NotifyIcon(NIM_DELETE, &nid); //////////////////////////////////////// } break; case WM_DESTROY: DestroyWindow(hwnd); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, msg, wp, lp); }