2
我已經創建了一個SDL2應用程序,並希望它最小化到系統托盤,而不是出現在任務欄中。最小化窗口到系統托盤
SDL_MinimizeWindow
不做我想做的事情,它會留下任務欄圖標。有沒有辦法通過SDL來實現這一點?
我已經創建了一個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);
}
這將創建一個隱藏的窗口和圖標(使用默認信息圖標)。
當您從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;
}
}
您正在尋找通知圖標。我不知道SDL2,所以我不知道它是否包含這個。在Win32中,你使用'Shell_NotifyIcon'函數來處理這些。 –
謝謝,@CodyGray –