Shell_NotifyIcon(NIM_MODIFY, NIF_INFO) возвращает TRUE, но всплывающее окно/уведомление не отображается (значок на панелC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Shell_NotifyIcon(NIM_MODIFY, NIF_INFO) возвращает TRUE, но всплывающее окно/уведомление не отображается (значок на панел

Сообщение Anonymous »

Я реализую значок на панели задач для запуска игры в Windows (C++, Win32 API). Сам значок на панели задач работает нормально: он появляется на панели задач, я могу щелкнуть его правой кнопкой мыши, чтобы отобразить контекстное меню, и дважды щелкнуть, чтобы восстановить окно запуска.
Когда игра запускается, я скрываю главное окно запуска и хочу показать всплывающее окно/уведомление, сообщающее пользователю, что программа запуска все еще работает в области уведомлений и что они могут снова открыть его из значка на панели задач.
Я использую Shell_NotifyIcon с NIM_MODIFY и NIF_INFO. Вызов возвращает TRUE, а GetLastError() возвращает 0, но всплывающие или всплывающие уведомления в Windows 11 не отображаются.
Вот соответствующий код.
Инициализация лотка

Код: Выделить всё

#include "SystemTraySDK.h"
#include "resource.h"
#include 
#include 

#define WM_TRAYICON     (WM_USER + 1)
#define ID_TRAYICON     1001
#define ID_TRAYMENU_EXIT 1002

HINSTANCE* hInst;
NOTIFYICONDATA nid;
HMENU hTrayMenu;
HWND hWnd;

bool g_trayReady = false;

LRESULT CALLBACK WndProcTray(HWND, UINT, WPARAM, LPARAM);
void InitNotifyIconData(HWND hWnd);
void ShowContextMenu(HWND hWnd, POINT pt);

int SystemTraySDK::init(HINSTANCE* hInstance, void* exitPacketCallbackPtr)
{
hInst = hInstance;

// Register tray window class
WNDCLASS wc = { 0 };
wc.lpfnWndProc   = WndProcTray;
wc.hInstance     = *hInst;
wc.lpszClassName = L"testclient";
RegisterClass(&wc);

// Message-only window for tray icon
hWnd = CreateWindow(
L"test",
L"test",
0, 0, 0, 0, 0,
HWND_MESSAGE,
NULL,
*hInst,
NULL
);

InitNotifyIconData(hWnd);

MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

Shell_NotifyIcon(NIM_DELETE, &nid);
return (int)msg.wParam;
}

void InitNotifyIconData(HWND hWnd)
{
ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
nid.cbSize           = sizeof(NOTIFYICONDATA);
nid.hWnd             = hWnd;
nid.uID              = ID_TRAYICON;
nid.uFlags           = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_TRAYICON;
nid.hIcon            = LoadIcon(*hInst, MAKEINTRESOURCE(IDI_ICON1));
lstrcpy(nid.szTip, L"test");

Shell_NotifyIcon(NIM_ADD, &nid);

// Set version for modern behavior (Windows 7+)
nid.uVersion = NOTIFYICON_VERSION_4;
Shell_NotifyIcon(NIM_SETVERSION, &nid);

g_trayReady = true;

// Context menu
hTrayMenu = CreatePopupMenu();
AppendMenu(hTrayMenu, MF_STRING, 100,             L"Open");
AppendMenu(hTrayMenu, MF_STRING, ID_TRAYMENU_EXIT, L"Close");
}
Значок на панели задач виден и работает должным образом.
Это вызывается после того, как я скрываю главное окно запуска (после запуска игры):

Код: Выделить всё

void SystemTraySDK::ShowRunningBalloon()
{
static bool s_shownOnce = false;
if (s_shownOnce)
return;

if (!g_trayReady) {
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79820937/shell-notifyiconnim-modify-nif-info-returns-true-but-no-balloon-notification[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»