2012-05-29 3 views
6

를 종료하지 않습니다내 Win32 응용 프로그램이 내 메인 루프입니다 메인 루프를

while(TRUE) 
    { 

    PeekMessage(&msg,hWnd,0,0,PM_REMOVE); 
     if (msg.message==WM_QUIT) 
      break; 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 


    } 

이 내 콜백 프로 시저입니다 : 내가 닫기 버튼 WM_NCLBUTTONDOWN 누르면 것을 발견

LRESULT CALLBACK WinProc(HWND hWnd,UINT msg1,WPARAM wParam,LPARAM lParam) 
{ 
    switch(msg1) 
    { 
     case WM_DESTROY : 
     { 
      PostQuitMessage(0); 
      return 0; 
     } 
     break; 
    } 

    return DefWindowProc(hWnd,msg1,wParam,lParam); 
} 

다음 루프에서 PeekMessage 함수에 의해 반환되며 WM_QUIT는 반환되지 않습니다.

+0

주 전에이 같은 문제에 대한 또 다른 질문이 있었다 : [무한 윈도우 메시지 루프 (http://stackoverflow.com/questions/10658813/infinite -windows-message-loop) – jamesdlin

답변

3

correct way 메시지 루프가

BOOL bRet; 
MSG msg; 
while ((bRet = GetMessage(&msg, hWnd, 0, 0)) != 0) 
{ 
    if (bRet == -1) 
    { 
     // handle the error and possibly exit 
    } 
    else 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

당신이 정말로 필요하다면 당신은 PeekMessage을 사용할 수 있습니다 할까 ... 그런데 왜 당신은 반환 값을 무시하는거야?

또한이 창은 특정입니다. 나는 PostQuitMessage스레드 인 것 같습니다. ... 나는 내 머리 꼭대기에서 그것을 기억하지 못하지만 hWnd 대신 NULL을 전달해야 할 수도 있습니다.

다른 창이있는 경우 메시지 루프를 도용 할 수 있습니다. 일반적으로 문제가 아닌 것으로 생각되지만 잠재적으로 문제가 될 수 있습니다. 그것을 명심하십시오.

+2

PeekMessage를 사용해야합니다. –

+0

@ThePianist : 편집 됨. – Mehrdad

+0

와우! 감사! (Damet garm! : D) Null로 바꿨다. –

0

내가 제대로 처리 할 수 ​​GetMessage 함수에 의해 반환 된 오류 (-1)을 보장하기 위해,이 고수 좋습니다 또한

while(GetMessage(&Msg, NULL, 0, 0) > 0) { 
    TranslateMessage(&Msg); 
    DispatchMessage(&Msg); 
} 

, 다른 오류가 WM_CLOSE 제대로 처리되지 않습니다. 대신 프로그램에서 실제로 WM_CLOSE (닫기 버튼)을 듣게하십시오.

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { 
    switch(Message) { 
     case WM_CLOSE: { 
      DestroyWindow(hwnd); // this 
      break; 
     } 
     case WM_DESTROY: { 
      PostQuitMessage(0); 
      break; 
     } 
     default: 
      return DefWindowProc(hwnd, Message, wParam, lParam); 
    } 
    return 0; 
} 
+0

PeekMessage를 사용해야합니다. –

+0

음, PeekMessage가 차단되지 않습니다. voor 메시지를 요청하여 CPU 코어를 pegging하지 않는 것이 좋습니다. 왜 실제로해야합니까? – Orwell

+0

@Orwell : 확실히 PeekMessage를 사용해야 할 상황이 있습니다. 그렇지 않다면 처음에 그 기능이 존재하는 이유를 생각해보십시오 ... – Mehrdad

2

다음은 코드입니다. 함께 일할 수있는 뭔가를 제공해야합니다.

// Main message loop: 
do 
{ 
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    { 
     if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } 

    // Run game code here. 
    gTradeApp->ExecuteNextAction(); 
} 
while (msg.message != WM_QUIT); 

과의 WndProc

LRESULT CALLBACK WndProc(HWND aHWnd, UINT aMessage, WPARAM aWParam, LPARAM aLParam) 
{ 
    switch (aMessage) 
    { 
    case WM_COMMAND: 
     return HandleCommand(aHWnd, aMessage, aWParam, aLParam); 

    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 

    default: 
     return DefWindowProc(aHWnd, aMessage, aWParam, aLParam); 
    } 

    return 0; 
} 
관련 문제