A.无窗口的线程 #i nclude "stdafx.h" INT PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpszCmdParam,INT nCmdShow) { MSG message; while(GetMessage(&message,NULL,0,0)) //建立消息循环 { TranslateMessage(&message); //翻译键盘消息 DispatchMessage(&message); //向消息处理模块发送消息 } return 0; } B.默认回调函数的窗口程序
#i nclude "stdafx.h" LRESULT CALLBACK WndProc(HWND hMainwnd, UINT message, WPARAM wParam, LPARAM lParam); HINSTANCE myhInst;//自己定义实例句柄名称!! char szAppName[]="WinAPIDemo";//应用程序名 char szAppTitle[]="利用应用程序接口的Windows应用程序";//程序标题 INT PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpszCmdParam,INT nCmdShow) { //主窗口句柄(句柄为窗口windows中的标识) HWND hMainwnd; WNDCLASS myWC;
//定义窗口类 { myWC.style =CS_HREDRAW|CS_VREDRAW; myWC.lpfnWndProc=DefWindowProc;//默认回调函数的窗口程序(窗口过程) myWC.cbClsExtra=0; myWC.cbWndExtra=0; myWC.hInstance=hInstance; myWC.hIcon=LoadIcon(NULL,IDI_APPLICATION); myWC.hCursor=LoadCursor(NULL,IDC_ARROW); myWC.hbrBackground=HBRUSH(GetStockObject(WHITE_BRUSH)); myWC.lpszMenuName=NULL; myWC.lpszClassName=szAppName; } RegisterClass(&myWC); //创建应用程序窗口 hMainwnd=CreateWindow(szAppName,//窗口类名 szAppTitle,//窗口标题 WS_OVERLAPPEDWINDOW,//窗口风格 200,//初始X坐标 200,//初始Y坐标 400,//初始宽度 500,//初始高度 NULL,//父窗口句柄 NULL,//窗口菜单句柄 hInstance,//程序当前句柄 NULL);//创建参数 ShowWindow(hMainwnd,SW_SHOWMAXIMIZED); //显示窗口 UpdateWindow(hMainwnd); //刷新窗口用户区 //定义windows消息数据结构(下面部分可以省略,没有线程-没有消息) MSG message; while(GetMessage(&message,NULL,0,0)) //建立消息循环 { TranslateMessage(&message); //翻译键盘消息 DispatchMessage(&message); //向消息处理模块发送消息 } return 0; }
C.用SPY++以及设置断点可以追踪到最简单的WIN32程序都具有进程和线程(没有窗口的程序) (个人理解:进程是指整个程序的实体,线程是程序内一个一个的代码执行片段) #i nclude "stdafx.h" INT PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpszCmdParam,INT nCmdShow) { WNDCLASS myWC; { myWC.style =CS_HREDRAW|CS_VREDRAW; myWC.lpfnWndProc=NULL; myWC.cbClsExtra=0; myWC.cbWndExtra=0; myWC.hInstance=hInstance; myWC.hIcon=LoadIcon(NULL,IDI_APPLICATION); myWC.hCursor=LoadCursor(NULL,IDC_ARROW); myWC.hbrBackground=HBRUSH(GetStockObject(WHITE_BRUSH)); myWC.lpszMenuName=NULL; myWC.lpszClassName=“szAppName”; } RegisterClass(&myWC);//可以去掉此句 return 0; } //MessageBox(NULL,"HelloWorld!","caption",1);//也可以用本句进行调试! D.完整一点的窗口及单线程(线程下含窗口)程序,利用了MFC的类库中的类WNDCLASS
#i nclude "stdafx.h" LRESULT CALLBACK WndProc(HWND hMainwnd, //窗口句柄 UINT message, //消息标识 WPARAM wParam, //消息附加信息 LPARAM lParam); //消息附加信息 HINSTANCE myhInst;//实例句柄 INT PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpszCmdParam,INT nCmdShow) { char szAppName[]="WinAPI应用程序名";//应用程序名 char szAppTitle[]="利用应用程序接口的Windows应用程序";//程序标题 //主窗口句柄(句柄为窗口windows中的标识) HWND hMainwnd; WNDCLASS myWC; //定义窗口类 { myWC.style =CS_HREDRAW|CS_VREDRAW; myWC.lpfnWndProc=WndProc;//没有执行,占据位置(空间) myWC.cbClsExtra=0; myWC.cbWndExtra=0; myWC.hInstance=hInstance; myWC.hIcon=LoadIcon(NULL,IDI_APPLICATION); myWC.hCursor=LoadCursor(NULL,IDC_ARROW); myWC.hbrBackground=HBRUSH(GetStockObject(WHITE_BRUSH)); myWC.lpszMenuName=NULL; myWC.lpszClassName=szAppName; } RegisterClass(&myWC); //创建应用程序窗口 hMainwnd=CreateWindow(szAppName,//窗口类名 szAppTitle,//窗口标题 WS_OVERLAPPEDWINDOW,//窗口风格 200,//初始X坐标 200,//初始Y坐标 400,//初始宽度 500,//初始高度 NULL,//父窗口句柄 NULL,//窗口菜单句柄 hInstance,//程序当前句柄 NULL);//创建参数 ShowWindow(hMainwnd,SW_SHOWMAXIMIZED); //显示窗口 UpdateWindow(hMainwnd); //刷新窗口用户区 //定义windows消息数据结构 MSG message; while(GetMessage(&message,NULL,0,0)) //建立消息循环 { TranslateMessage(&message); //翻译键盘消息 DispatchMessage(&message); //向消息处理模块发送消息(系统指令) } return message.wParam;//return 0;是一样的! }
//只能被回调!!! LRESULT CALLBACK WndProc(HWND hMainwnd, //窗口句柄 UINT message, //消息标识 WPARAM wParam, //消息附加信息 LPARAM lParam) //消息附加信息 { char MsgLBTN[]="你刚按下了鼠标左键!"; char MsgRBTN[]="你刚按下了鼠标右键!"; //消息处理分支 switch(message) { case WM_RBUTTONDOWN: //右鼠标键被按下 { MessageBeep(MB_ICONINFORMATION); MessageBox(GetFocus(),MsgRBTN,"Message",MB_OK|MB_ICONINFORMATION); break; } case WM_LBUTTONDOWN: //左鼠标键被按下 { MessageBeep(MB_ICONINFORMATION); MessageBox(GetFocus(),MsgLBTN,"Message",MB_OK|MB_ICONINFORMATION); break; } case WM_DESTROY: //关闭窗口,非常关键!没有则线程消息循环无法退出,造成资源泄露!!! { PostQuitMessage(0);//使函数GetMessage(&message,NULL,0,0)不成立,退出循环(线程) return 0;//可以去掉此句。 } default: return DefWindowProc(hMainwnd,message,wParam,lParam); } return 0; } //MessageBox(NULL,"HelloWorld!","caption",1);//也可以用本句进行调试! |