2

次を使用してsystrayアイコンを作成します。

BOOL TrayMessage(HWND hWnd, DWORD dwMessage)
{
    NOTIFYICONDATA nid;
    nid.cbSize = sizeof(nid);
    nid.hWnd = hWnd;
    nid.uID = 1;
    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    nid.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_MYAPP));
    lstrcpy(nid.szTip, L"MyApp");
    nid.uCallbackMessage = WM_NOTIFYICON;
    return Shell_NotifyIcon(dwMessage, &nid);
}

アプリの起動時/ウィンドウの作成時:

case WM_CREATE:
    if (!TrayMessage(hWnd, NIM_ADD))
        MessageBox(hMainWnd, L"Tray error.", 0, 0);

このエラー メッセージ ボックス:

  • .exe を正常に起動すると、決して起こりません。

  • ユーザーのログアウト/ユーザーの再ログイン後にのみ発生し、平均して 5 回の起動ごとに 1 回(私のアプリは、TaskSchedular タスクを使用してセッションを開始するたびに自動的に起動されます)

もちろん、エラーが発生すると、アイコンはタスクバーに表示されません。

その理由は何ですか?

  1. systray システムはまだ準備ができていません (ユーザーのログアウト/再ログインの直後)?

  2. タスクバー自体はまだ準備ができていませんか?

  3. 作成物を 以外の場所に移動する必要がありWM_CREATEますか?


編集:@ RbMmのコメントの後、私はこれを試しました:

case WM_CREATE:
    TrayMessage(hWnd, NIM_ADD);
    // I removed MessageBox(...) from here
    uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
    ... 
    break;

default:
    if (message == uTaskbarRestart)
    {
        TrayMessage(hWnd, NIM_ADD);
        MessageBox(hMainWnd, L"TaskbarRestart", 0, 0);
    }

このテストの結果: トレイ アイコンが表示されない場合は、まさにMessageBoxTaskbarRestartが表示されない場合、つまり TaskbarRestart イベントがメッセージ ループに来ない場合です... おかしいです...

注: これは、ユーザーのログアウト/再ログイン後にのみ発生します。

4

1 に答える 1