次を使用して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 タスクを使用してセッションを開始するたびに自動的に起動されます)
もちろん、エラーが発生すると、アイコンはタスクバーに表示されません。
その理由は何ですか?
systray システムはまだ準備ができていません (ユーザーのログアウト/再ログインの直後)?
タスクバー自体はまだ準備ができていませんか?
作成物を 以外の場所に移動する必要があり
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 イベントがメッセージ ループに来ない場合です... おかしいです...
注: これは、ユーザーのログアウト/再ログイン後にのみ発生します。