2016-06-01 5 views
0

Когда окна запускают мою программу с аргументом/p, она инициализирует окно SDL над HWND этого небольшого монитора предварительного просмотра. Проблема в том, что когда окно предварительного просмотра закрывается, мой процесс продолжает работать. Я попытался поймать WM_DESTROY с помощью SDL_SYSWMEVENT, но он не сработал: он ловит WM_SETCURSOR, WM_NCHITTEST и некоторые другие, но не уничтожает. Как исправить эту проблему?
Вот мой код.Как закончить приложение заставки SDL после закрытия окна предварительного просмотра?

#include <SDL2/SDL.h> 
#include <SDL2/SDL_syswm.h> 
#include <windows.h> 
#include <cstring> 
#include <cctype> 
#include <cstdlib> 
#include <cstdio> 

char *lowercase(const char *str) { 
    char *ans=new char[strlen(str)+1]; int i; 
    for (i=0;str[i]>0;i++) ans[i]=tolower(str[i]); 
    ans[i]=0; return ans; 
} 

int main(int argc,char **argv) { 
    if (argc>1&&(strcmp(lowercase(argv[1]),"/c")==0||strcmp(lowercase(argv[1]),"-c")==0)) { 
     MessageBox(NULL,"Config should be there, WIP!","Screensaver",MB_OK); 
     return 0; 
    } 
    FILE *f; 
    SDL_Init(SDL_INIT_VIDEO); 
    int SCREEN_WIDTH,SCREEN_HEIGHT; 
    SDL_Window *wnd; 
    bool preview; 
    if (preview=(argc>2&&(strcmp(lowercase(argv[1]),"/p")==0||strcmp(lowercase(argv[1]),"-p")==0))) { 
     wnd=SDL_CreateWindowFrom((HWND)atoi(argv[2])); 
     SDL_GetWindowSize(wnd,&SCREEN_WIDTH,&SCREEN_HEIGHT); 
    } else { 
     SDL_DisplayMode tmp; 
     SDL_GetCurrentDisplayMode(0,&tmp); 
     SCREEN_WIDTH=tmp.w;SCREEN_HEIGHT=tmp.h; 
     wnd=SDL_CreateWindow("",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,SCREEN_WIDTH,SCREEN_HEIGHT,SDL_WINDOW_SHOWN|SDL_WINDOW_FULLSCREEN); 
    } 
    SDL_Renderer *rnd=SDL_CreateRenderer(wnd,-1,SDL_RENDERER_ACCELERATED); 
    SDL_DisableScreenSaver(); 
    bool quit=false; 
    SDL_Event evt; 
    SDL_EventState(SDL_SYSWMEVENT,SDL_ENABLE); 
    while (SDL_PollEvent(&evt)); //clear event queue 
    while (!quit) { 
     while (SDL_PollEvent(&evt)) switch (evt.type) { 
      /* does not work 
      case SDL_SYSWMEVENT: { 
       if (evt.syswm.msg->msg.win.msg==WM_DESTROY) quit=true; 
       break; 
      } 
      */ 
      case SDL_QUIT: 
       quit=true; 
       break; 
      case SDL_KEYDOWN: 
      case SDL_MOUSEBUTTONDOWN: 
      case SDL_MOUSEMOTION: 
       if (!preview) quit=true; 
       break; 
     } 
     SDL_RenderClear(rnd); 
     SDL_SetRenderDrawColor(rnd,255,255,255,255); 
     SDL_RenderDrawLine(rnd,0,0,SCREEN_WIDTH,SCREEN_HEIGHT); 
     SDL_SetRenderDrawColor(rnd,0,0,0,255); 
     SDL_RenderPresent(rnd); 
     SDL_Delay(20); 
    } 
    SDL_Quit(); 
    return 0; 
} 

ответ

0

Хорошо, после долгих исследований я нашел ответ. Благодаря that guy.

if (!IsWindow(previewHwnd)) quit=true; 
0

Глядя на this статьи, появляется сообщение со списком вы ищете

WM_SYSCOMMAND SC_CLOSE

+0

это не зацепиться WM_SYSCOMMANDs –

+0

http://sdl.libsdl.narkive.com/tIFS5P2n/sdl-eventfilter сообщения как WM_SYSCOMMAND передаются вам как SDL_SYSWM сообщений –