2007-08-04

タスクバーにアイコンを表示する方法

Today画面のタスクバーにアイコンを出す方法のメモ。
WM6のTrayAppサンプルが参考(というかそのまま)。
 
アイコンの表示は Shell_NotifyIconにNIM_ADD(アイコン追加)、NIM_DELETE(削除)、NIM_DELETE(変更)のいずれかのメッセージとNOTIFYICONDATA構造体へのポインタを指定して呼び出すようです。
#define TRAY_NOTIFYICON WM_USER + 2001
#define ID_TRAY 5000

BOOL TrayMessage(
    HWND hwnd, 
    DWORD dwMessage,
    UINT uID, 
    HICON hIcon, 
    PTSTR pszTip
    )
{
  BOOL res = FALSE;
  NOTIFYICONDATA tnd;
  
  tnd.cbSize = sizeof(NOTIFYICONDATA);
  tnd.hWnd = hwnd;
  tnd.uID = uID;
  tnd.uFlags = NIF_MESSAGE|NIF_ICON;
  tnd.uCallbackMessage = TRAY_NOTIFYICON;
  tnd.hIcon = hIcon;
  tnd.szTip[0] = '\0';
  
  res = Shell_NotifyIcon(dwMessage, &tnd);
  return res;
}

void TrayIconAdd(
    HWND hwnd, 
    UINT uID, 
    HICON hIcon, 
    PTSTR pszTip
    )
{
    TrayMessage(hwnd, NIM_ADD, uID,  hIcon, NULL);
}

BOOL WINAPI MainDlgProc(
    HWND hDlg, 
    UINT Msg, 
    WPARAM wParam, 
    LPARAM lParam
    )
{
    switch (Msg)
    {

    case WM_INITDIALOG:
    
        // アイコン表示
        TrayIconAdd(hDlg, ID_TRAY, LoadIcon(g_hInst, MAKEINTRESOURCE(APP_ICON)), NULL);
        return(TRUE);
        

 
NOTIFYICONDATA構造体には表示したいアイコンのハンドルやIDの他にメッセージを処理するウィンドウのハンドルやウィンドウに送られるメッセージのIDを指定します。
タスクバーのアイコンでイベントが発生したときはここで指定されたメッセージが送られ、wParamにアイコンのIDが入っています。
BOOL WINAPI MainDlgProc(
    HWND hDlg, 
    UINT Msg, 
    WPARAM wParam, 
    LPARAM lParam
    )
{
    switch (Msg)
    {

    case TRAY_NOTIFYICON:
        switch (lParam)
        {
        case WM_LBUTTONDOWN:
            if (ID_TRAY == wParam)
            {
                // アイコンがクリックされたときの処理
            }
            break;
        }


 

0 件のコメント: