Свернуть окно в системный трей

Я создал приложение SDL2 и хотел бы, чтобы оно сворачивалось в панель задач, а не отображалось на панели задач.

SDL_MinimizeWindow не выполняет то, что я хочу, оставляет значок на панели задач. Есть ли способ добиться этого с помощью SDL?


person Colin    schedule 03.01.2017    source источник
comment
Вам нужен значок уведомления. Я не знаю SDL2, поэтому не знаю, обертывает ли он это. В Win32 для управления ими используется функция Shell_NotifyIcon.   -  person Cody Gray    schedule 03.01.2017


Ответы (1)


Не существует чисто SDL2-способа сделать это, как сказал Коди, 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);
}

Это создает скрытое окно и значок (с использованием значка информации по умолчанию).

Чтобы взаимодействовать с этим из SDL, вам необходимо включить события управления окнами, специфичные для платформы, это делается следующим образом SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);

После этого в основном цикле событий вы должны проверить SDL_SYSWMEVENT, который содержит информацию о том, как пользователь взаимодействовал со значком в области уведомлений. Это также ищет событие сворачивания и скрывает окно, которое удаляет его с панели задач. Это достигается в следующем фрагменте

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;
    }
}
person Colin    schedule 04.01.2017