GetMessage用法错误导致程序不能退出
2011-09-27 22:53
507 查看
#include <windows.h> #include <stdio.h> LRESULT CALLBACK WinUoowProc( //回调函数声明 HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); int WINAPI WinMain( HINSTANCE hInstance, //WinMain主函数 HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASS wndcls; // 创建窗口类 wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); wndcls.hInstance=hInstance; wndcls.lpfnWndProc=WinUoowProc; wndcls.lpszClassName="First Window"; wndcls.lpszMenuName=NULL; wndcls.style=CS_DBLCLKS |CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); //注册窗口 HWND hwnd; //创建窗口 hwnd=CreateWindow("First Window","Window BY Dancer_dus7",WS_OVERLAPPEDWINDOW, 300,200,600,400,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOWNORMAL); //显示窗口 UpdateWindow(hwnd); //更新窗口 MSG msg; while(GetMessage(&msg,NULL/*hwnd*/,0,0)) //主循环 注意若注释处改成hwnd,则程序仍运行在任务管理器 { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WinUoowProc( //回调函数 HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg) //消息处理 { case WM_CHAR: char szChar[20]; sprintf(szChar,"char is %d",wParam); MessageBox(hwnd,szChar,"key code:",0); break; case WM_LBUTTONDOWN: MessageBox(hwnd,"mouse clicked!","mouse",MB_OK); HDC hdc; hdc=GetDC(hwnd); TextOut(hdc,0,50,"HELLO WORLD!",strlen("HELLO WORLD!")); ReleaseDC(hwnd,hdc); break; case WM_PAINT: HDC hDC; PAINTSTRUCT ps; hDC=BeginPaint(hwnd,&ps); TextOut(hDC,0,0,"First Window!",strlen("First Window!")); EndPaint(hwnd,&ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0; }
MSDN中的说明,要避免while(GetMessage( lpMsg, hWnd, 0, 0))这种用法,避免出现-1的结果,窗口已经销毁,但是仍在运行。
Note that the function return value can be nonzero, zero, or -1. Thus, you should avoid code like this:
(GetMessage( lpMsg, hWnd, 0, 0))...
The possibility of a -1 return value means that such code can lead to fatal application errors.
while(GetMessage( lpMsg, NULL, 0, 0))才正确。
但是觉得还是没有说清楚,就是为什么GetMessage第二个参数为hwnd的时候就会出现窗口销毁而程序仍在任务管理窗口运行的现象,msdn好像没有说的很明白?望高手解答。
相关文章推荐
- GetMessage参数错误导致无法完全退出程序
- PeekMessage 导致程序不能正常退出 CPU100%
- 转载 C#写的程序,在关机时不能退出,导致系统不能关机。
- 通过windug判断某个模块导致程序不能退出。
- 字符串的小错误导致程序运行失败
- wxFreeChart 示例程序退出时错误信息
- 转载: 关于SIGPIPE导致的程序退出
- 关于SIGPIPE导致的程序退出
- 关于SIGPIPE导致的程序退出
- 不指定主窗口,程序不能退出消息泵
- 归档日志满导致ORA-13516错误,AWR报表不能自动收集
- 编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误,可以重新输入,最多输入三次。三次均错,则提示退出程序。
- 野指针:小小的程序错误导致严重安全漏洞
- java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误
- android.webkit.WebView 使用 SINGLE_COLUMN layout algorithm 导致程序意外退出的解决办法
- 对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决
- 修改DNS域名转发器解决IP解析错误导致的网站不能访问
- 关于SIGPIPE导致的程序退出
- VS2008工具箱错误导致项目不能编译