最小化 window 到系统托盘
Minimize window to system tray
我创建了一个 SDL2 应用程序,并希望它最小化到系统托盘,而不是出现在任务栏中。
SDL_MinimizeWindow
不符合我的要求,它留下了任务栏图标。有没有办法用 SDL 实现这个?
没有纯粹的 SDL2 方法可以做到这一点,正如 Cody 所说,Shell_NotifyIcon
是创建通知区域(系统托盘)图标所需的功能。
我用来获取图标的代码是
SDL_Window *window = SDL_CreateWindow("Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 200, 200, SDL_WINDOW_HIDDEN);
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
NOTIFYICONDATA icon;
if (SDL_GetWindowWMInfo(window, &info))
{
icon.uCallbackMessage = WM_USER + 1;
icon.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
icon.hIcon = LoadIcon(NULL, IDI_INFORMATION);
icon.cbSize = sizeof(icon);
icon.hWnd = info.info.win.window;
strcpy_s(icon.szTip, "Test tip");
bool success = Shell_NotifyIcon(NIM_ADD, &icon);
}
这会创建一个隐藏的 window 和一个图标(使用默认信息图标)。
要从 SDL 与此交互,您需要启用特定于平台的 window 管理事件,操作如下 SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
在此之后,您必须在主事件循环中测试 SDL_SYSWMEVENT
,其中包含有关用户如何与通知区域图标进行交互的信息。这也会查找最小化事件并隐藏 window 以将其从任务栏中删除。这是在以下代码段中实现的
SDL_Event e;
while (SDL_PollEvent(&e) != 0)
{
switch (e.type)
{
case SDL_SYSWMEVENT:
if (e.syswm.msg->msg.win.msg == WM_USER + 1)
{
if (LOWORD(e.syswm.msg->msg.win.lParam) == WM_LBUTTONDBLCLK)
{
SDL_ShowWindow(window);
SDL_RestoreWindow(window);
}
}
break;
case SDL_QUIT:
running = false;
break;
case SDL_WINDOWEVENT:
if (e.window.event == SDL_WINDOWEVENT_MINIMIZED)
SDL_HideWindow(window);
break;
}
}
我创建了一个 SDL2 应用程序,并希望它最小化到系统托盘,而不是出现在任务栏中。
SDL_MinimizeWindow
不符合我的要求,它留下了任务栏图标。有没有办法用 SDL 实现这个?
没有纯粹的 SDL2 方法可以做到这一点,正如 Cody 所说,Shell_NotifyIcon
是创建通知区域(系统托盘)图标所需的功能。
我用来获取图标的代码是
SDL_Window *window = SDL_CreateWindow("Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 200, 200, SDL_WINDOW_HIDDEN);
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
NOTIFYICONDATA icon;
if (SDL_GetWindowWMInfo(window, &info))
{
icon.uCallbackMessage = WM_USER + 1;
icon.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
icon.hIcon = LoadIcon(NULL, IDI_INFORMATION);
icon.cbSize = sizeof(icon);
icon.hWnd = info.info.win.window;
strcpy_s(icon.szTip, "Test tip");
bool success = Shell_NotifyIcon(NIM_ADD, &icon);
}
这会创建一个隐藏的 window 和一个图标(使用默认信息图标)。
要从 SDL 与此交互,您需要启用特定于平台的 window 管理事件,操作如下 SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
在此之后,您必须在主事件循环中测试 SDL_SYSWMEVENT
,其中包含有关用户如何与通知区域图标进行交互的信息。这也会查找最小化事件并隐藏 window 以将其从任务栏中删除。这是在以下代码段中实现的
SDL_Event e;
while (SDL_PollEvent(&e) != 0)
{
switch (e.type)
{
case SDL_SYSWMEVENT:
if (e.syswm.msg->msg.win.msg == WM_USER + 1)
{
if (LOWORD(e.syswm.msg->msg.win.lParam) == WM_LBUTTONDBLCLK)
{
SDL_ShowWindow(window);
SDL_RestoreWindow(window);
}
}
break;
case SDL_QUIT:
running = false;
break;
case SDL_WINDOWEVENT:
if (e.window.event == SDL_WINDOWEVENT_MINIMIZED)
SDL_HideWindow(window);
break;
}
}