2009-08-29 5 views
1

임는 Win32에서 안녕하세요 세상을 작성하려고하지만 난 주 창을 닫을 때 앱이PostQuitMessage() 내 응용 프로그램을 닫지 않습니까?

내 창 프로 시저를 계속 실행 :

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam) 
{ 
    switch (msg) 
    { 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     return 0; 
    } 
    return DefWindowProc(hWnd, msg, wparam, lparam); 
} 

이벤트 루프 : 이제

while ((bret = GetMessage(&msg, hWndMain, 0, 0) != 0) 
{ 
    if (bret == -1) 
    { 
     DWORD error = GetLastError(); 
     return 1; 
    } 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

을, 그런 다음 WM_QUIT 가져 오는 것을 나타내는 0을 반환하는 GetMessage() 대신 "-1"을 반환하고 "잘못된 창 핸들"인 오류 1400에 대한 GetLastError() whinges를 반환합니다. ... 난 당황해.

답변

10

일반적으로 GetMessage()에는 NULL을 전달하고 창 핸들은 전달하지 않으므로 이후에 완료되고 친구가 완료되면 ERROR_INVALID_WINDOW_HANDLE이 표시되는 이유를 설명 할 수 있습니다. 그러면 친구가 더 이상 존재하지 않습니다. PostQuitMessage()에 의해 게시 된 WM_QUIT는 스레드 메시지이므로 핸들이있는 GetMessage는 절대로 처리하지 않습니다.

구현 세부 사항이지만 PostQuitMessage는 실제 메시지를 게시하지 않습니다. 단지 스레드에 의해 저장된 플래그 일 뿐이며 GetMessage는 필요할 때 자동으로 메시지를 생성합니다. 자세한 내용은 this blog post을 참조하십시오.

0

나는 개인적으로이 작업을 수행 :

if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
{ 
    if(msg.message == WM_QUIT) 
    { 
     break; 
    } 

    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 
관련 문제