アトリエ ぺっぺ

トップページ > プログラムTips > タスクトレイのアイコン登録

◆ タスクトレイへのアイコン登録
タスクトレイへアイコンを登録する方法を示します。
まず、タスクトレイを登録したいウィンドウクラスで、NOTIFYICONDATAという型のメンバを追加します。
// クラスのヘッダ
class CMyDlg : public CDialog
{
public:
    CMyDlg(CWnd* pParent = NULL);
    virtual ~CMyDlg();
    //   :
    // 省略
    //   :
    // アイコンデータの変数を宣言
    NOTIFYICONDATA m_nIcon;
};
その後、登録したいタイミングの場所に、下記のコードを追加します。
ダイアログなら、OnInitDiarog()のタイミングがいいでしょう。
// クラスの実装ファイル
BOOL CMyDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    //   :
    // 省略
    //   :
    
    // アイコンデータを作成
    m_nIcon.cbSize = sizeof( NOTIFYICONDATA) ;
    m_nIcon.uID = 1 ;
    m_nIcon.hWnd = m_hWnd ;
    m_nIcon.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP ;
    m_nIcon.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);// このアイコンが登録されます。
    m_nIcon.uCallbackMessage = WM_TRYCLK ;
    lstrcpy( m_nIcon.szTip, AfxGetAppName());

    // アイコンをタスクトレイへ登録
    ::Shell_NotifyIcon(NIM_ADD, &m_nIcon);

    return TRUE;
}
上記コード内のWM_TRYCLKメッセージは、アイコンがクリックされたときに送られてくるメッセージです。
実際にWM_TRYCLKメッセージというのは存在しないので、以下のようにアプリケーションメッセージとして定義しておきましょう。
#define WM_TRYCLK WM_APP + 10 // 10の値は適当です。範囲内で自由に定義可能です。
 
登録したアイコンは、アプリケーション終了時に登録破棄しないといつまでも残ったままとなってしまいます。
デストラクタで登録破棄しましょう。
// クラスの実装ファイル
CMyDlg::~CMyDlg()
{
    // タスクトレイからアイコンを削除
    ::Shell_NotifyIcon(NIM_DELETE, &m_nIcon);
}
 
次に、先ほど定義したWM_TRYCLKメッセージのハンドラを作成します。
まず、クラスに関数の宣言を追加します。
// クラスのヘッダ
class CMyDlg : public CDialog
{
public:
    CMyDlg(CWnd* pParent = NULL);
    virtual ~CMyDlg();
    //   :
    // 省略
    //   :
    NOTIFYICONDATA m_nIcon;

    // 関数を宣言
    afx_msg LRESULT OnTrayClk(WPARAM wParam, LPARAM lParam);
};
次に、メッセージマップにWM_TRYCLKメッセージを追加します。
// クラスの実装ファイル
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
// メッセージハンドラを設定
ON_MESSAGE(WM_TRYCLK, OnTrayClk)
//   :
// 省略
//   :
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

最後に、関数自体を実装します。
// クラスの実装ファイル
LRESULT CDlgDlg::OnTrayClk(WPARAM wParam, LPARAM lParam)
{
    CString strwork("");
    switch(lParam){
    case WM_LBUTTONUP:
        strwork = "左クリック";
        break;
case WM_RBUTTONUP: strwork = "右クリック"; break; } if(!strwork.IsEmpty()){ AfxMessageBox(strwork); } return 0L; }
 

(C) 2002 atelier-peppe
ababa@atelier-peppe.sakura.ne.jp