2017-01-03 164 views
2

我已經創建了一個SDL2應用程序,並希望它最小化到系統托盤,而不是出現在任務欄中。最小化窗口到系統托盤

SDL_MinimizeWindow不做我想做的事情,它會留下任務欄圖標。有沒有辦法通過SDL來實現這一點?

+2

您正在尋找通知圖標。我不知道SDL2,所以我不知道它是否包含這個。在Win32中,你使用'Shell_NotifyIcon'函數來處理這些。 –

+0

謝謝,@CodyGray –

回答

4

沒有純粹的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; 
    } 
}