代码如下:#include"windows.h"
#include"stdio.h"LRESULT CALLBACK MyProc(    HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS a;
a.cbClsExtra=0;
a.cbWndExtra=0;
a.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
a.hCursor=LoadCursor(NULL,IDC_CROSS);
a.hIcon=LoadIcon(NULL,IDI_APPLICATION);
a.hInstance=hInstance;
a.lpfnWndProc=MyProc;
a.lpszClassName="aaa";
a.lpszMenuName=NULL;
a.style=CS_VREDRAW|CS_HREDRAW; RegisterClass(&a); HWND hwnd;
hwnd=CreateWindow("aaa","ben zhu",WS_OVERLAPPEDWINDOW  ,
0,0,600,600,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd); MSG msg;
while (GetMessage(&msg, hwnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
}LRESULT CALLBACK MyProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{ HDC hdc;
PAINTSTRUCT ps;
switch(uMsg)
{
case WM_PAINT:
BeginPaint(hwnd, &ps);
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,0,0,"You are my girlfrend!",strlen("You are my girlfrend!"));
EndPaint(hwnd, &ps);
break;
case WM_CHAR:
char a[100];
memset(a,0,100);
sprintf(a,"the char is %d",wParam);
MessageBox(hwnd,a,"ben zhu",MB_OK);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"hello","aaa",MB_OK);
HDC hDC;
hDC=GetDC(hwnd);
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,20,30,"You are lovely!",strlen("You are lovely!"));
ReleaseDC(hwnd,hDC);
break;
case WM_CLOSE:
DestroyWindow( hwnd );
SendMessage(hwnd, WM_DESTROY,0,0);

break;
case WM_DESTROY:
if(IDYES==MessageBox(hwnd,"是否要退出","aaa", MB_YESNO|MB_DEFBUTTON2))
PostQuitMessage(0);//这有问题吗?
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0;
}

解决方案 »

  1.   

    if(IDYES==MessageBox(hwnd,"是否要退出","aaa", MB_YESNO &brvbarMB_DEFBUTTON2))
    PostQuitMessage(0);//这有问题吗? 
    -------------------
    没进去,MessageBox返回1, IDYES在我这是6,所以没执行PostQuitMessage(0)
      

  2.   

    MSG msg; 
    while (GetMessage(&msg, hwnd, 0, 0))   // -->改为while (GetMessage(&msg, NULL, 0, 0))

    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    } 另外MessageBox应该放在WM_CLOSE里面,在DestroyWindow( hwnd )之前,否则点否的话,窗口依然会消失,但程序不会退出……
      

  3.   

    2楼说的完全正确,因为在CLOSE消息之后,窗口已经没了,但GetMessage函数需要在收到QUIT消息才能结束程序,所以,在窗口消失后,哪个hwnd变成了无效值,但不是0,导致了死循环;改成NULL后,GetMessage函数可以对所有消息进行监控,可以合理的退出。
      

  4.   

    DestroyWindow( hwnd ); 
    SendMessage(hwnd, WM_DESTROY,0,0); 
    这2句的意义是一样的,一句就可以了
      

  5.   

    while (GetMessage(&msg, hwnd, 0, 0)) 
    经典错误,hwnd改为NULL。
      

  6.   

    我也不懂 找了点例子 还不是很明白 希望高人指点
    两个代码有什么不同呢 第一个不能结束程序 第二个却可以 困惑
    http://topic.csdn.net/t/20021115/13/1179420.html#include"windows.h" 
    #include"stdio.h" 
    #define _T(x) x
    LRESULT CALLBACK MyProc(    HWND hwnd, 
    UINT uMsg, 
    WPARAM wParam, 
    LPARAM lParam 
    ); 
    int WINAPI WinMain( HINSTANCE hInstance, 
       HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, 
       int nCmdShow) 

    HWND   hwnd;   
    MSG   Msg;   
    WNDCLASS   wndclass;   
    char   lpszClassName[]="窗口";   
    char   lpszTitle[]="窗口示例";   
    wndclass.style=CS_HREDRAW   |   CS_VREDRAW;   
    wndclass.lpfnWndProc   =MyProc;   
    wndclass.cbWndExtra=0;   
    wndclass.cbClsExtra   =0;   
    wndclass.hInstance=hInstance;   
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);   
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);   
    wndclass.hbrBackground   =   (HBRUSH)(GetStockObject(WHITE_BRUSH));   
    wndclass.lpszMenuName=NULL;   
    wndclass.lpszClassName=lpszClassName;   
    if(!RegisterClass(&wndclass))   
    {   
    MessageBeep(0);   
    return   FALSE;   
    }   
    hwnd=CreateWindow(lpszClassName,   
    lpszTitle,   
    WS_OVERLAPPEDWINDOW,   
    CW_USEDEFAULT,   
    CW_USEDEFAULT,   
    CW_USEDEFAULT,   
    CW_USEDEFAULT,   
    NULL,   
    NULL,   
    hInstance,   
    NULL);   
    ShowWindow(hwnd,SW_SHOW); 
    UpdateWindow(hwnd); 

    MSG msg; 
    while (GetMessage(&msg, hwnd, 0, 0)) 

    TranslateMessage(&msg); 
    DispatchMessage(&msg); 


    return msg.wParam; 
    } LRESULT CALLBACK MyProc( 
    HWND hwnd, 
    UINT uMsg, 
    WPARAM wParam, 
    LPARAM lParam 


    switch(uMsg)   
    {   
    case   WM_CLOSE:   
    MessageBox(NULL,_T("收到WM_CLOSE消息,即将调用   DestroyWindow(hwnd);"),_T("注意了"),MB_OK);   
    DestroyWindow(hwnd);   
    break;           
    case   WM_DESTROY:   
    MessageBox(NULL,_T("已调用过DestroyWindow(hwnd),看不到窗口了吧;"),_T("注意了"),MB_OK);   
    MessageBox(NULL,_T("以下处理WM_DESTROY"),_T("注意了"),MB_OK);   
    PostQuitMessage(0);   
    break;   
    case   WM_SYSCOMMAND:   
    if((LOWORD(wParam)&0xFFF0)==SC_CLOSE)   
    {   
    MessageBox(NULL,_T("你关闭了窗口,即将发送WM_CLOSE消息!"),_T("注意了"),MB_OK);   
    SendMessage(hwnd,WM_CLOSE,0,0);   
    }   
    //不要添加   break,否则不能响应其它WM_SYSCOMMAND消息   
    default:   
            return   DefWindowProc(hwnd,uMsg,wParam,lParam);   
    }   
    return(0);   
    } #include   <Windows.h>   
    #include   <TCHAR.h>   
    LRESULT   CALLBACK   WndProc(HWND,UINT,WPARAM,LPARAM);   
    int   WINAPI   WinMain(HINSTANCE   hInstance,   
       HINSTANCE   hPrevInst,   
       LPSTR           lpszCmdLine,   
       int                 nCmdShow)   
    {   
    HWND   hwnd;   
    MSG   Msg;   
    WNDCLASS   wndclass;   
    char   lpszClassName[]="窗口";   
    char   lpszTitle[]="窗口示例";   
    wndclass.style=CS_HREDRAW   |   CS_VREDRAW;   
    wndclass.lpfnWndProc   =WndProc;   
    wndclass.cbWndExtra=0;   
    wndclass.cbClsExtra   =0;   
    wndclass.hInstance=hInstance;   
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);   
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);   
    wndclass.hbrBackground   =   (HBRUSH)(GetStockObject(WHITE_BRUSH));   
    wndclass.lpszMenuName=NULL;   
    wndclass.lpszClassName=lpszClassName;   
    if(!RegisterClass(&wndclass))   
    {   
    MessageBeep(0);   
    return   FALSE;   
    }   
    hwnd=CreateWindow(lpszClassName,   
    lpszTitle,   
    WS_OVERLAPPEDWINDOW,   
    CW_USEDEFAULT,   
    CW_USEDEFAULT,   
    CW_USEDEFAULT,   
    CW_USEDEFAULT,   
    NULL,   
    NULL,   
    hInstance,   
    NULL);   
    ShowWindow(hwnd,nCmdShow);   
    UpdateWindow(hwnd);   
    while(1)   
    {   
    GetMessage(&Msg,NULL,0,0);   
    if(Msg.message==WM_QUIT)   
    {   
    MessageBox(NULL,_T("收到WM_QUIT,即将跳出消息循环"),_T("注意了"),MB_OK);   
    break;   
    }   
    TranslateMessage(&Msg);   
    DispatchMessage(&Msg);   
    }   
    MessageBox(NULL,_T("已经跳出消息循环,应用程序即将结束!"),_T("注意了"),MB_OK);   
    return   Msg.wParam;   
    }   
    LRESULT   CALLBACK   WndProc(   
     HWND   hwnd,   
     UINT   message,   
     WPARAM   wParam,   
     LPARAM   lParam)   
    {     
    switch(message)   
    {   
    case   WM_CLOSE:   
    MessageBox(NULL,_T("收到WM_CLOSE消息,即将调用   DestroyWindow(hwnd);"),_T("注意了"),MB_OK);   
    DestroyWindow(hwnd);   
    break;           
    case   WM_DESTROY:   
    MessageBox(NULL,_T("已调用过DestroyWindow(hwnd),看不到窗口了吧;"),_T("注意了"),MB_OK);   
    MessageBox(NULL,_T("以下处理WM_DESTROY"),_T("注意了"),MB_OK);   
    PostQuitMessage(0);   
    break;   
    case   WM_SYSCOMMAND:   
    if((LOWORD(wParam)&0xFFF0)==SC_CLOSE)   
    {   
    MessageBox(NULL,_T("你关闭了窗口,即将发送WM_CLOSE消息!"),_T("注意了"),MB_OK);   
    SendMessage(hwnd,WM_CLOSE,0,0);   
    }   
    //不要添加   break,否则不能响应其它WM_SYSCOMMAND消息   
    default:   
            return   DefWindowProc(hwnd,message,wParam,lParam);   
    }   
    return(0);   
    }   
      

  7.   

    我单步执行了 的确执行到PostQuitMessage了
    但是应用程序没退出
      

  8.   


    我把全部的MessageBox屏蔽掉程序还是没有退出 ,窗口没有了,进程还在
      

  9.   

    还是Mackz说的正确 
    MSDN的解释:
    hWnd 
    Handle to the window whose messages are to be retrieved. One value has a special meaning: Value Meaning 
    NULL GetMessage retrieves messages for any window that belongs to the calling thread and thread messages posted to the calling thread via PostThreadMessage. 
      

  10.   

    上面大家不说了吗?GetMessage(&msg, hwnd, 0, 0)这句中的hwnd应该改为NULL,因加了hwnd之后这个WM_QUIT就只发给hwnd窗口,但是此时已经没有窗口了,GetMessage只有在收到WM_QUIT时才会返回假,while才会结束.所以你的进程没有窗口了但是进程还在.