タスクトレイにアイコンを表示するには?

解決


UJ  2009-04-24 21:16:17  No: 70052

win32アプリケーションで常駐型のアプリを作成しているのですが、
int MyInitNotifyIcon(HWND hWnd)
{
  memset(&ni, 0, sizeof(NOTIFYICONDATA));

  ni.cbSize = sizeof(NOTIFYICONDATA);
  ni.hWnd = hWnd;
  ni.uID = ID_MYTRAY;
  ni.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
  ni.hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON1),IMAGE_ICON, 16, 16, 0);
  ni.uCallbackMessage =MYTRAY_MESSAGE;
  lstrcpy(ni.szTip, TEXT("UJ"));
  Shell_NotifyIcon(NIM_ADD, &ni);
  bTray = true;
  return 0;
}
のように記述して起動時にこの関数を呼んでいるのですが、
アイコンが正しく表示されません。
アイコンファイルをいろいろ変えてみても、
・領域のみできているがアイコンが表示されない
・三角の黄色いアイコンが表示される
・?の青いアイコンが表示される
のいづれかの状態になっています。

どこが原因なのかわからず途方にくれております。
ご指南いただけますでしょうか?


dora  2009-04-24 22:40:39  No: 70053

アイコンは、LoadOmageではなく、LoadIconを使うのでは?
ni.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));

私はこれでうまくいっています。

ちなみに、環境はきちんと書いた方がいいと思います。
OSは?VC++のバージョンは?MFC?SDK?etc.・・・


UJ  2009-04-24 23:00:18  No: 70054

LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));
を使っても?の青いアイコンが表示されてしまいました。

環境ですが、
VISTA VC++2008 
MFCではないので、SDKだと思います。


どら  2009-04-24 23:09:34  No: 70055

dora→どら(変換忘れ^^;)です。

えと、リソースでちゃんとアイコンファイルを読み込んでいますか?
おそらく、指定されているIDI_ICON1が空のアイコンなのでは?

Express Editionでないのであれば、リソースエディタからアイコンを追加して、そのリソースIDでLoadIconしてください。

Express Editionの場合は・・・たしかリソースファイルを直接編集だったかな?
スミマセン、ちょっと覚えてません^^;


UJ  2009-04-24 23:14:29  No: 70056

Express Editionではありません。

リソースファイルを追加し、新しいアイコンを作成。
仮で真黒なアイコンを作っても、?の青いアイコンが表示されてしまいます。


どら  2009-04-24 23:38:12  No: 70057

一度以下の手順を試してみてください。
1.適当なアイコンファイルを入手。
2.リソースエディタから1で入手したアイコンを追加
3.2で取り込んだアイコンのIDで、LoadIcon

これでそのアイコンが表示されたら、アイコン側の問題かと。


UJ  2009-04-24 23:50:36  No: 70058

hInstの値がおかしかったようです。

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
  MSG msg;
  BOOL bRet;

  hIcon = LoadIcon(hCurInst, MAKEINTRESOURCE(IDI_ICON1));

  if(!InitApp(hCurInst)) 
    return false;
  if(!InitInstance(hCurInst, nCmdShow)) 
    return false;

  while((bRet = GetMessage(&msg, NULL, 0, 0) != 0))
  {
    if(bRet == -1)
    {
      break;
    }
    else
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
  }

  return (int)msg.wParam;

}
int MyInitNotifyIcon(HWND hWnd)
{
  memset(&ni, 0, sizeof(NOTIFYICONDATA));

  ni.cbSize = sizeof(NOTIFYICONDATA);
  ni.hWnd = hWnd;
  ni.uID = ID_MYTRAY;
  ni.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
  ni.hIcon = hIcon;
  ni.uCallbackMessage =MYTRAY_MESSAGE;
  lstrcpy(ni.szTip, TEXT("UJ"));
  Shell_NotifyIcon(NIM_ADD, &ni);
  bTray = true;
  return 0;
}
と記述したらうまく表示できました。
お手数おかけしました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加