プログラミングメモ →目次

タスクトレイにアイコンを表示する(VC++)

ウィンドウズのタスクバーの右端にタスクトレイ(システムトレイとも言う)に、自分のプログラムを制御する為のアイコンを追加する方法のメモです。アイコンを追加するには下記のAPIを使います。

BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA lpData);

引数のdwMessageで、アイコンに対するの操作を示します。NIM_ADD:アイコン追加、NIM_DELETE:アイコン削除、NIM_MODIFY:アイコン変更。

1.ウィンドウズのメッセージIDを用意します。
UINT iTrayMsg = RegisterWindowMessage("XXXXNotify");
或いは、
UINT iTrayMsg = WM_APP + 適当の数字; 
のように、タスクトレイからの通知を受ける為のメッセージIDを用意します。

 

2.アイコンを追加します。例:

#include "shellapi.h"
void AddTrayIcon(void)
{
    NOTIFYICONDATA icndata;
    memset(&icndata, 0, sizeof(icndata));
    icndata.cbSize = sizeof(icndata);
    //自分のウィンドウのハンドルを代入する
    icndata.hWnd = ((CTestTrayApp*)AfxGetApp())->m_pMainWnd->GetSafeHwnd();
    //チップメッセージも文字列をコピーする
    strcpy(icndata.szTip, "何でも", strlen("何でも"));
    //アイコンをセットする
    icndata.hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
    //システムトレーからの通知メッセージをセットする
    icndata.uCallbackMessage = iTrayMsg;
    icndata.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    Shell_NotifyIcon(NIM_ADD, &icndata);
}
3.アイコンを削除します。 例:
void RemoveTrayIcon(void)
{
    NOTIFYICONDATA icndata;
    memset(&icndata, 0, sizeof(icndata));
    icndata.cbSize = sizeof(icndata);
    icndata.hWnd = AfxGetApp()->m_pMainWnd->GetSafeHwnd();
    Shell_NotifyIcon(NIM_DELETE, &icndata);
}
4.タスクトレイからの通知メッセージ。例:タスクトレイに表示されているアイコンをダブルクリックして、自分のウィンドウを表示、非表示します。m_bShowing は、ウィンドウの状態を記録する変数で、Appクラスに追加します。
LRESULT CXTrayDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    if(message == iTrayMsg)
    {
        if(lParam == WM_LBUTTONDBLCLK)
        {
            if (((CTestTrayApp*)AfxGetApp())->m_bShowing)
            {
                ((CTestTrayApp*)AfxGetApp())->m_bShowing = FALSE;
                ((CTestTrayApp*)AfxGetApp())->m_pMainWnd->ShowWindow(SW_HIDE);
            }
            else
            {
                ((CTestTrayApp*)AfxGetApp())->m_bShowing = TRUE;
                ((CTestTrayApp*)AfxGetApp())->m_pMainWnd->ShowWindow(SW_SHOW);
            }
        }
    }
    return CDialog::DefWindowProc(message, wParam, lParam);
}