2017-01-03 3 views
2

私はSDL2アプリケーションを作成しましたが、タスクバーに表示するのではなく、システムトレイに最小化します。ウィンドウをシステムトレイに最小化する

SDL_MinimizeWindow私がしたいことはしません、それはタスクバーのアイコンを残します。 SDLでこれを達成する方法はありますか?

+2

通知アイコンを探しています。私はSDL2を知らないので、これをラップするかわかりません。 Win32では、これらを操作するために 'Shell_NotifyIcon'関数を使います。 –

+0

ありがとう、@CodyGray –

答えて

4

コーディーは、Shell_NotifyIconが通知領域(システムトレイ)アイコンを作成するために必要な機能であるため、これを行うための純粋にSDL2の方法はありません。

私はアイコンを取得するために使用されるコードは

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_SYSWMEVENTのためにテストする必要があり、メインイベントループで、この後SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);

を次のようにこれが行われ、プラットフォーム固有のウィンドウ管理イベントを有効にする必要がありますユーザーは通知領域アイコンと対話しています。また、これは、最小のイベントを探し、タスクバーから削除するウィンドウを隠します。これは次のスニペットで実現します

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; 
    } 
} 
関連する問題