Когда игра запускается, я скрываю главное окно запуска и хочу показать всплывающее окно/уведомление, сообщающее пользователю, что программа запуска все еще работает в области уведомлений и что они могут снова открыть его из значка на панели задач.
Я использую 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]
Мобильная версия