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);//也可以用本句进行调试!
评论